从批处理脚本中调用Powershell命令时,双引号是否不能从字符串转义?

时间:2019-04-25 18:17:37

标签: powershell batch-file cmd

通过批处理脚本调用的powershell实例传递时,测试消息中未保留双引号结构,如下所述:

set test={"this":"is","a":"test"}
FOR /F "delims=" %%i in (' powershell -Command "& {$message = '%test%'; echo $message}" ') DO SET message=%%i
echo %test%
echo %message%

输出如下:

{"this":"is","a":"test"}
{this:is,a:test}

我想保留引号以进一步在powershell中处理字符串,但是如您所见,将引号引入$message变量后会删除它们。

是否有关于如何解决此问题的见解?

1 个答案:

答案 0 :(得分:4)

在d-引号的powershell命令中回显包含双引号的%test%将破坏括起来的d-引号。

克服这一问题的一种方法是使用批处理字符串替换以动态的反斜杠转义内部d引号

:: Q:\Test\2019\04\25\SO_55855412.cmd
@Echo off
set "test={"this":"is","a":"test"}"
FOR /F "delims=" %%i in ('
     powershell -Command "& {$message = '%test:"=\"%'; echo $message}" 
') DO SET "message=%%i"
echo %test%
echo %message%

返回此处:

> SO_55855412.cmd
{"this":"is","a":"test"}
{"this":"is","a":"test"}

另一种解决方法是传递%test%作为参数,而是从继承的环境中获取变量

    powershell -Command "& {$message = $env:test; echo $message}"

遗憾的是,这无法将变量传回,因为在终止生成的应用程序时,继承的环境将被丢弃。