【问题标题】:passing \ in argument to powershell script causes unexpected escaping将 \ in 参数传递给 powershell 脚本会导致意外转义
【发布时间】:2015-09-08 09:46:30
【问题描述】:

这是我的 powershell 脚本 test.ps1:

Write-Output $args;

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

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

输出是:

c:"

有什么方法可以引用我的论点,以使 c:\ 实际上被采用并按原样存储在 $args[0] 变量中?我知道我可以通过"c:\\" 解决这个quick'dirty,但这不是一个真正的解决方案。

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

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

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

我的 test.bat 脚本:

echo %~1

我运行它:

test.bat "c:\"

回报不错:

c:\

【问题讨论】:

  • 反斜杠似乎被用作转义字符,但前提是它是引用字符串中的最后一个字符。

标签: powershell arguments


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    PowerShell.exe 的帮助文件说:

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

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

    powershell -file test.ps1 c:\
    

    打印

    c:\
    

    同样,这也有效

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

    但是你的 arg 有你想要修剪的额外空间。顺便说一句,单引号在这里没有帮助:

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

    【讨论】:

    • 我需要引号,因为文件路径可能包含空格。使用-File 的原因之一是因为在文件参数名称之后键入的“所有字符”都被“解释”为脚本文件路径,后跟脚本参数。 但我不明白如何该报价解释了最后一个报价的转义......当我阅读报价时,我不希望任何转义,当然也不是最后一个(?)字符。
    • @davor 这是导致它的 powershell.exe 命令行语法解析。如果你需要传递引号,你会使用 \" 来做到这一点,这就是它认为正在发生的事情
    【解决方案3】:

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

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

    这对我有用:

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

    (以双引号结尾)

    【讨论】:

    • 我正在从 cmd 执行它。那么 cmd 是罪魁祸首吗?如果我用代码echo %* 编写一个简单的 test.bat 脚本,我会得到 c:\。所以它似乎不是 cmd 引起的问题。
    • 也许,你试过没有引号的 'C:\' 甚至 c:\ 吗?
    • 'c:\' 会返回 'c:\' 并且 c:\ 会返回 c:\ 但最后一个不是一个选项,因为路径中可能存在空格。
    • @davor 我可以批量重现这个“问题”。我还不知道解决方案。 Pehaps cmd 正在转义 "
    • 这应该是评论,而不是答案。多一点代表,you will be able to post comments。在此之前,请不要使用答案作为解决方法。
    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2015-06-07
    • 2017-05-08
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多