从 Win 10 CMD 调用 Powershell,相同的代码导致不同的结果

从 Win 10 CMD 调用 Powershell,相同的代码导致不同的结果

包含命令的变量:

set code=$param3 = 'https://edmullen.net/test/rc.jpg'; $c = '$task = $client.GetByteArrayAsync(""' + $param3; $d = '$task = $client.GetByteArrayAsync(""' + $param3;

当我运行下面的两个 CMD 代码时,每次都会得到不同的结果,为什么?

start powershell -noexit "%code%"
start powershell -noexit "!code!"

$c & $d 的结果:(注意引号)

PS > $c
$task = $client.GetByteArrayAsync("https://edmullen.net/test/rc.jpg
PS > $d
$task = $client.GetByteArrayAsync(https://edmullen.net/test/rc.jpg
PS >

答案1

找到了!
似乎是一些 powershell 错误:重音符 ` 或双引号 " 转义双引号 ” 导致了不一致。在两种情况下,使用反斜杠 \ 进行转义都有效。

由于我是从 Win CMD 调用 powershell 代码的,因此 Microsoft 支持声明使用插入符号 ^ 作为转义字符。
请参阅此处的类似问题:
https://stackoverflow.com/questions/7760545/escape-double-quotes-in-parameter

在这种情况下,插入符号 ^ 也无法转义引号。

set code=$param3 = 'https://edmullen.net/test/rc.jpg'; $d = '$task = $client.GetByteArrayAsync(\"' + $param3 + '\"'; $c = '$task = $client.GetByteArrayAsync(\"' + $param3 + '\"';

结果是:

PS > $c
$task = $client.GetByteArrayAsync("https://edmullen.net/test/rc.jpg"
PS > $d
$task = $client.GetByteArrayAsync("https://edmullen.net/test/rc.jpg"
PS >

作为最后的手段,我必须运行帮助文件中所述的编码命令:

-EncodedCommand
接受命令的 base-64 编码字符串版本。使用此参数将需要复杂引号或花括号的命令提交到 Windows PowerShell。

要使用 -EncodedCommand 参数:

$command = 'dir "c:\program files" '
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
powershell.exe -encodedCommand $encodedCommand

相关内容