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"

Хитрость заключается в том, чтобы избежать "с \, а не с".

Ссылка, которая помогла мне понять это.

Другие вопросы по тегам