【问题标题】:Powershell in Jenkins escaping characters for pathJenkins中的Powershell为路径转义字符
【发布时间】:2021-06-28 13:54:56
【问题描述】:

我有一个声明性管道,它应该执行一个用于安装路径的 powershell 步骤。
路径作为参数提供:

parameters {
    string(name: 'UNC', defaultValue: '\\\\server01.lab.local\\shared_data', description: 'Shared location to build-data')
}

当我在简单的打印中使用此值时,它按预期工作:

...
powershell('''
           write-host "test: "${env:UNC}""
           ''')
...

所以下一步实际上是安装它。但是,它没有按预期工作:

...
powershell('''
           New-PSDrive -Name "k" -PSProvider "FileSystem" -Root "\"${env:UNC}\"\"
           ''')
...

我在这里遇到的错误是:powershell.exe : New-PSDrive : A positional parameter cannot be found that accepts argument '\\server01.lab.local\shared_data'. New-PSDrive -Name "k" -PSProvider "FileSystem" -Root ""${ ...
这就是我明白引用是问题的时候。有效的 Powershell 命令是:

New-PSDrive -Name "k" -PSProvider "FileSystem" -Root "\\server01.labl.local\shared_data"

那么在转义 UNC 路径中的引号方面,我在这里遗漏了什么?

谢谢

【问题讨论】:

    标签: powershell jenkins-pipeline escaping jenkins-groovy


    【解决方案1】:

    不要试图引用${env:UNC}

    powershell('''
               New-PSDrive -Name "k" -PSProvider "FileSystem" -Root ${env:UNC}
               ''')
    

    如果您确实需要"..." 中转义"使用`" 而不是\";例如,
    "Nat `"King`" Cole" 逐字输出Nat "King" Cole - 继续阅读以了解更多信息。


    • 在 PowerShell 中,\ 具有 no 特殊含义,而是 `(即所谓的反引号)充当转义字符,即在这些情况下:

      • 双引号内 ("...")

        • 仅在 "..." 内,您可以使用 "" 替代 `" 来转义嵌入的 " 字符(但其他两个字符需要在 "..."$` 内转义本身,只能分别转义为 `$``)。
      • 在未引用的命令参数中(不常见);例如:

        Get-Item C:\Program` Files # Note the escaped space char.
        
      • 请注意,` 不仅用于表示要逐字使用下一个字符,还可以作为转义的开始序列,表示控制字符并且,仅在 PowerShell (Core) 6+ 中,Unicode 字符;例如,"`t" 扩展为制表符,"`u{fc}" 扩展为 ü。请参阅概念性 about_Special_Characters 主题。

    • 在 PowerShell 中永远不需要将用作 命令参数的双引号变量引用(或表达式结果)(除非您明确需要先转换为字符串)。

      • 例如,以下工作正常:

        $dir = 'C:\Program Files'
        Get-Item $dir # NO need to double-quote $dir
        
      • 如果你真的需要逐字传递" 字符。作为参数实际值的一部分:

        Write-Output "Nat `"King`" Cole"
        
      • 注意:即使在调用外部可执行文件时,也不需要在变量引用/表达式周围加双引号,因为 PowerShell 然后自动在后面应用双引号场景,根据需要,基于值是否包含空格。

        • 不幸的是,从 PowerShell 7.1 开始,将逐字 嵌入 " 字符的参数传递给外部程序仍然被破坏,尽管最终正在考虑修复 - 请参阅 this answer

    至于你尝试了什么

    \ 在 PowerShell 中并非特殊(尽管需要在 PowerShell CLI 的参数中逐字转义 " 字符。 >[1])。

    因此,"\"${env:UNC}\"\" 被解析如下:

    • 参数 1:
      • "\" 是一个双引号字符串,包含\ 的逐字内容。由于复合标记的开头的带引号的字符串(即,如果直接跟在另一个带引号或不带引号的标记之后)始终被视为本身的参数,因此该值成为其自己的参数。 this answer 讨论了这个值得注意的陷阱。
    • 参数 2:
      • ${env:UNC}\ 扩展为环境变量 UNC 的值,后跟 \
      • "\" 又是一个双引号字符串,带有逐字内容\;因为它直接跟在 unquoted 标记 ${env:UNC}\ 之后,所以它被认为是 same 参数的一部分。

    以下示例输出接收到的包含在<...> 中的参数,每个参数都在自己的行中,演示了这一点:

    PS> $env:UNC='foo bar'; 
        & { foreach ($arg in $args) { "<$arg>" } } "\"${env:UNC}\"\"
    
    <\>
    <foo bar\\>
    

    [1] 这适用于powershell.exeWindows PowerShell CLI; pwsh,PowerShell (Core) v6+ CLI,也可以接受 "" - 请参阅 this answer 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2011-01-20
      • 2017-10-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多