Jenkins中的PowerShell为Path转义字符 [英] Powershell in Jenkins escaping characters for path

查看:7
本文介绍了Jenkins中的PowerShell为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.localshared_data'. New-PSDrive -Name "k" -PSProvider "FileSystem" -Root ""${ ...
这就是我明白报价是个问题的时候。可以工作的PowerShell命令是:

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

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

谢谢

推荐答案

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

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

如果您确实需要在"..."内部转义<2-2]>,则使用`"NOT";例如
"Nat `"King`" Cole"逐字生成Nat "King" Cole-继续阅读了解更多信息。


  • 在PowerShell中,没有的特殊含义,而是`(所谓的反号)作为转义字符,即在以下上下文中:

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

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

      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中不是特殊的(尽管它是逐字转义"字符所必需的。在PowerShellCLI[1]的参数中)。

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

  • 参数1:
    • ""是带双引号的字符串,内容完全一致。由于复合标记开头处的带引号的字符串(即,如果后面紧跟另一个带引号或不带引号的标记)始终被视为参数本身,因此该值将成为其自身的参数。this answer中讨论了这一值得注意的陷阱。
  • 参数2:
    • ${env:UNC}扩展到环境变量的值UNC,后跟逐字
    • ""再次是具有完整内容的双引号字符串;因为它紧跟在不带引号的内标识${env:UNC}之后,所以它被视为ame参数的一部分。

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

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

<>
<foo bar\>

[1]这适用于powershell.exeWindows PowerShellCLI;pwshPowerShell(Core)V6+CLI,也可以接受""-有关详细信息,请参阅this answer

这篇关于Jenkins中的PowerShell为Path转义字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆