CMD: Как избежать этой команды powershell в cmd?
У меня есть следующая команда powershell:
(gc c:\foo.xml -Raw) -replace '(?s)(.*)<bar baz="foo" />', '$1LOL' | Out-File c:\foo.xml
Я знаю, что эта команда powershell работает, когда я набираю ее в PowerShell.
Теперь я хочу запустить его из командной строки cmd, поэтому я знаю, что нужно сделать в cmd:
powershell -Command [the-above-powershell-command]
Тем не менее, команда powershell имеет так много специальных символов, что независимо от того, что я использую, я не могу сделать это правильно.
Может ли кто-нибудь избежать команды powershell для меня, чтобы я мог поместить ее в cmd?
2 ответа
Альтернативой является кодирование 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)
Это, в вашем случае, приведет к строке:
KABnAGMAIABjADoAXABmAG8AbwAuAHgAbQBsACAALQBSAGEAdwApACAALQByAGUAcABsAGEAYwBlACAAJwAoAD8AcwApACgALgAqACkAPABiAGEAcgAgAGIAYQB6AD0AIgBmAG8AbwAiACAALwA+ACcALAAgACcAJAAxAEwATwBMACcAIAB8ACAATwB1AHQALQBGAGkAbABlACAAYwA6AFwAZgBvAG8ALgB4AG0AbAA=
Звоню из cmd
:
powershell.exe -EncodedCommand KABnAGMAIABjADoAXABmAG8AbwAuAHgAbQBsACAALQBSAGEAdwApACAALQByAGUAcABsAGEAYwBlACAAJwAoAD8AcwApACgALgAqACkAPABiAGEAcgAgAGIAYQB6AD0AIgBmAG8AbwAiACAALwA+ACcALAAgACcAJAAxAEwATwBMACcAIAB8ACAATwB1AHQALQBGAGkAbABlACAAYwA6AFwAZgBvAG8ALgB4AG0AbAA=
Нашел ответ сам:
powershell -Command "(gc c:\foo.xml -Raw) -replace '(?s)(.*)<bar baz=\"foo\" />', '$1LOL' | Out-File c:\foo.xml"
Хитрость заключается в том, чтобы избежать "с \, а не с".
Ссылка, которая помогла мне понять это.