从Cmd传递Powershell进行变量评估

时间:2019-02-26 20:17:42

标签: 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

当我这样做时,我目前遇到以下问题:

  

该字符串缺少终止符:“。

     

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

     

+ FullyQualifiedErrorId:TerminatorExpectedAtEndOfString

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

批处理文件 [1] 中,您必须转义 %个字符,< em>以%% 的身份通过到达目标应用。

否则,cmd%解释为环境变量引用的开始或结束(部分原因是设计在您的环境中命令;例如%CONFIG_FILE%)。

(您已经正确地将命令中嵌入"字符的嵌入\" 。对于PowerShell,%)。

具体来说,命令%{...}部分中的%需要转义(ForEach-Objectpowershell -command "get-content %CONFIG_FILE% | %% {$_ -replace \"APP_PATH=.+\",\"APP_PATH=%APP_DIR%\"}" cmdlet的PowerShell内置别名):

ForEach-Object

或者,只需使用cmdlet的实际名称powershell -command "get-content %CONFIG_FILE% | ForEach-Object {$_ -replace \"APP_PATH=.+\",\"APP_PATH=%APP_DIR%\"}" ,就可以避免转义:

cmd.exe

[1]不幸的是,{{1}}的命令提示符(在交互式会话中)的行为不同-请参见this answer < / p>