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

cal*_*cal 1 powershell cmd batch-file

当通过批处理脚本调用的 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%
Run Code Online (Sandbox Code Playgroud)

输出如下:

{"this":"is","a":"test"}
{this:is,a:test}
Run Code Online (Sandbox Code Playgroud)

我想保留引号以在 powershell 中进一步处理字符串,但正如您所看到的,它们在引入变量时被删除$message

关于如何解决这个问题有什么见解吗?

小智 5

在 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%
Run Code Online (Sandbox Code Playgroud)

返回这里:

> SO_55855412.cmd
{"this":"is","a":"test"}
{"this":"is","a":"test"}
Run Code Online (Sandbox Code Playgroud)

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

    powershell -Command "& {$message = $env:test; echo $message}"
Run Code Online (Sandbox Code Playgroud)

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