在批处理脚本中执行powershell命令时转义字符

时间:2017-11-08 05:27:13

标签: powershell batch-file escaping

我想执行powershell命令并将其放入批处理变量

命令:

for /f "delims=" %%i in ('powershell ^(Get-ChildItem ""\dir\"" -Name | sort-object {\[regex\]::Replace^($_,^'\d+^',{$args\[0\].Value.PadLeft^(20^)}^)} | select -last 1^) ') do set output=%%i

由于特殊字符而无法执行。另外,在我看到问题之前,我无法暂停窗口以使其关闭。

我认为问题在于管道" |",因为以下命令可以正常工作(管道前的部分)

for /f "delims=" %%i in ('powershell ^(Get-ChildItem ""\dir\"" -Name^) ') do set output=%%i

我尝试在管道之前添加^^^^"",但不起作用。你能发现问题吗?

2 个答案:

答案 0 :(得分:1)

Powershell可以接受Base64编码的命令,这是克服cmd脚本中特殊字符的便捷方法。像这样,

$command = 'gci -param | stuff | ? { something }'
$bytes = [Text.Encoding]::Unicode.GetBytes($command)
$encoded = [Convert]::ToBase64String($bytes)
$encoded # Get output
ZwBjAGkAIAAtA...

现在你已经有了一个base64字符串,在批处理文件中传递它

set encoded=ZwBjAGkAIAAtA...
for /f "delims=" %%i in ('powershell -encodedCommand %encoded' ...)

要反转Base64编码,请使用

[Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($encoded))

答案 1 :(得分:1)

这似乎适用于将PowerShell脚本放在"引号内,而不会将所有内容转移到所有内容中:

for /f "delims=" %%i in ('powershell.exe "Get-ChildItem c:\temp -Name | Sort-Object -Property { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }| select-object -first 1"') do set output=%%i