通过变量求值从Cmd传递Powershell

通过变量求值从Cmd传递Powershell,powershell,batch-file,Powershell,Batch File,我想使用以下命令 powershell -command "get-content %CONFIG_FILE% | %{$_ -replace \"APP_PATH=.+\",\"APP_PATH=%APP_DIR%\"}" 但使用批处理脚本中定义的%CONFIG_FILE%和%APP_DIR%进行计算时 set CONFIG_FILE=C:\B0_GW.cfg set APP_DIR=C:\dbg\kernel 当我这样做时,我

我想使用以下命令

powershell -command "get-content %CONFIG_FILE% | %{$_ -replace \"APP_PATH=.+\",\"APP_PATH=%APP_DIR%\"}"
但使用批处理脚本中定义的%CONFIG_FILE%和%APP_DIR%进行计算时

set CONFIG_FILE=C:\B0_GW.cfg 
set APP_DIR=C:\dbg\kernel
当我这样做时,我当前遇到以下问题:

字符串缺少终止符:“

+CategoryInfo:ParserError:(:)[],ParentContainerErrorRecordException

+FullyQualifiedErrorId:TerminatorExpectedAtEndOfString

有什么想法吗?

在对这个问题的评论中提供了关键的指针:

在批处理文件[1]中,必须将要传递给目标应用程序的
%%
字符转义为
%%

否则,
cmd
%
解释为环境变量引用的开始或结束(这部分是通过命令中的设计实现的;例如,
%CONFIG\u FILE%

(您已经在命令中将嵌入的
字符作为PowerShell的
\”
正确转义)

具体而言,命令的
%{…}
部分中的
%
需要转义(
%
是PowerShell为
ForEach对象
cmdlet的内置别名):

或者,只需使用cmdlet的实际名称,
ForEach Object
,这样就无需转义:

powershell -command "get-content %CONFIG_FILE% | ForEach-Object {$_ -replace \"APP_PATH=.+\",\"APP_PATH=%APP_DIR%\"}"


[1] 遗憾的是,
cmd.exe(在交互式会话中)的命令提示符处的行为有所不同-请参见。

我想您需要将
%{${code>中的
%
-符号加倍以转义:
%{${$}在批处理文件中,在两个
set
命令下面,放置:
powershell get content%CONFIG\u file%^%{$\uu-replace\'APP\u PATH=.+\',\'APP\u PATH=%APP\u DIR%\'}
或只是
powershell获取内容%CONFIG\u FILE%^ |%%{$\uu-replace“APP\u PATH=.+”,“APP\u PATH=%APP\u DIR%”
@Aacini:最好保留所包含的
。。。“
围绕PowerShell代码,因为如果没有它们,
%APP\u PATH%
值和两个或多个相邻的嵌入空格(无论多么罕见)将破坏该命令。您的第二个建议总是会破坏,因为PowerShell会将未被替换的
在解释代码之前的CLI解析过程中。请允许我向新来者提供标准建议:如果答案解决了您的问题,请单击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票要求至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受(您将获得2个信誉点)和向上投票有助于未来的读者。有关更多信息,请参阅。如果您的问题尚未完全回答,请提供反馈或建议。
powershell -command "get-content %CONFIG_FILE% | ForEach-Object {$_ -replace \"APP_PATH=.+\",\"APP_PATH=%APP_DIR%\"}"