将\ in参数传递给powershell脚本会导致意外转义

时间:2015-06-22 19:43:22

标签: powershell arguments

这是我的powershell脚本test.ps1:

Write-Output $args;

现在假设我有一个批处理脚本,它用各种路径调用这个powershell脚本。其中之一是c:\

powershell -executionpolicy Bypass -file test.ps1 "c:\"

输出结果为:

  

C:“

有没有办法引用我的参数,以便c:\实际上会被采用并存储在<{1>}变量中的 ?我知道我可以通过传递$args[0]来解决这个 quick'dirty ,但这不是一个真正的解决方案。

编辑:在test.ps1中使用命名参数没有任何区别:

"c:\\"

EDIT2:使用批处理文件可以正常工作。

我的test.bat脚本:

[CmdletBinding()]
param(
    [string]$argument
)
Write-Output $argument;

我跑了:

echo %~1

很好地返回:

  

C:\

3 个答案:

答案 0 :(得分:1)

你确定这是来自powershell而不是来自调用你声明的程序吗?反斜杠在powershell中不是转义码。

我的test.ps1正在运行,当从ise运行时。

这对我有用:

powershell -executionpolicy Bypass -command "test.ps1 -argument 'C:\'"

(以报价双引号结束)

答案 1 :(得分:1)

PowerShell.exe的帮助文件说:

  

文件必须是命令中的最后一个参数,因为在文件参数名称后键入的“所有字符”被“解释”为脚本参数后面的脚本文件路径。

您反对Powershell.exe的命令行解析器,它使用“\”来转义引号。你需要报价吗?不是你的情况:

powershell -file test.ps1 c:\

打印

c:\

同样,这也有效

powershell -file test.ps1 "c:\ "
c:\

然后你的arg有你想要修剪的额外空间。 BTW,单引号在这里没有帮助:

powershell -file test.ps1 'c:\'
'c:\' 

答案 2 :(得分:0)

如果您需要将最终反弹传递给命令,则可以使用

$ArgWithABackslashTemp = $ArgWithABackslash -replace '\\$','\\'
&$ExePath $ArgWithABackslashTemp

或者,如果exe足够聪明,可以在没有反斜杠的情况下处理它

&$ExePath $ArgWithABackslash.trim('\')