通过变量求值从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%\"}"