CMD:如何在cmd中转义此powershell命令?

igb*_*tiz 2 powershell cmd

我有以下powershell命令:

(gc c:\foo.xml -Raw) -replace '(?s)(.*)<bar baz="foo" />', '$1LOL' | Out-File c:\foo.xml
Run Code Online (Sandbox Code Playgroud)

我知道验证这个powershell命令在PowerShell中输入时有效.

现在我想从cmd提示符运行它,所以我知道我需要在cmd中执行:

powershell -Command [the-above-powershell-command]
Run Code Online (Sandbox Code Playgroud)

但是,powershell命令有很多特殊字符,无论我使用什么逃脱,我都无法做到正确.

有人可以为我逃脱powershell命令,所以我可以把它放在cmd?

igb*_*tiz 5

自己找到了答案:

powershell -Command "(gc c:\foo.xml -Raw) -replace '(?s)(.*)<bar baz=\"foo\" />', '$1LOL' | Out-File c:\foo.xml"
Run Code Online (Sandbox Code Playgroud)

诀窍是逃避"与\,而不是".

帮助我解决问题的链接.


Mat*_*sen 5

另一种方法是Base64编码命令并使用-EncodedCommand开关:

$CmdLine = @'
(gc c:\foo.xml -Raw) -replace '(?s)(.*)<bar baz="foo" />', '$1LOL' | Out-File c:\foo.xml
'@
$CmdLineBytes = [System.Text.Encoding]::Unicode.GetBytes($CmdLine)
$EncodedCommand = [System.Convert]::ToBase64String($CmdLineBytes)
Run Code Online (Sandbox Code Playgroud)

在您的情况下,这将导致字符串:

KABnAGMAIABjADoAXABmAG8AbwAuAHgAbQBsACAALQBSAGEAdwApACAALQByAGUAcABsAGEAYwBlACAAJwAoAD8AcwApACgALgAqACkAPABiAGEAcgAgAGIAYQB6AD0AIgBmAG8AbwAiACAALwA+ACcALAAgACcAJAAxAEwATwBMACcAIAB8ACAATwB1AHQALQBGAGkAbABlACAAYwA6AFwAZgBvAG8ALgB4AG0AbAA=
Run Code Online (Sandbox Code Playgroud)

cmd以下地方拨打电话:

powershell.exe -EncodedCommand KABnAGMAIABjADoAXABmAG8AbwAuAHgAbQBsACAALQBSAGEAdwApACAALQByAGUAcABsAGEAYwBlACAAJwAoAD8AcwApACgALgAqACkAPABiAGEAcgAgAGIAYQB6AD0AIgBmAG8AbwAiACAALwA+ACcALAAgACcAJAAxAEwATwBMACcAIAB8ACAATwB1AHQALQBGAGkAbABlACAAYwA6AFwAZgBvAG8ALgB4AG0AbAA=
Run Code Online (Sandbox Code Playgroud)