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.exe
、Windows PowerShell CLI; pwsh
,PowerShell(核心)v6+ CLI,或者接受 ""
- 有关详细信息,请参阅 。
我有一个声明性管道,它应该执行一个 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 7.1 开始,通过逐字 嵌入
至于你试过的:
\
在 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.exe
、Windows PowerShell CLI; pwsh
,PowerShell(核心)v6+ CLI,或者接受 ""
- 有关详细信息,请参阅