包含命令的变量:
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