Jenkins 中的 Powershell 转义路径字符

Powershell in Jenkins escaping characters for path

我有一个声明性管道,它应该执行一个 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 路径中的引号方面我在这里遗漏了什么?

谢谢

根本不要尝试引用 ${env:UNC}:

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

如果您确实需要在 "..." 转义 " 使用 `" 不是 \";例如,
"Nat `"King`" Cole" 逐字生成 Nat "King" Cole - 请继续阅读以获取更多信息。


  • 在 PowerShell 中,\ 没有 特殊含义,而是 `(所以-称为 backtick) 用作转义字符,即在这些上下文中:

    • 内部 双引号字符串 ("...")

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

      Get-Item C:\Program` Files # Note the escaped space char.
      
    • 请注意 ` 不仅用于表示下一个字符将逐字使用,而且还作为转义 sequences[=143] 的开始=] 表示 控制字符 并且仅在 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.
    • 中讨论了这个值得注意的陷阱
  • 参数二:
    • ${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(核心)v6+ CLI,或者接受 ""- 有关详细信息,请参阅