Jenkins 中的 Powershell 转义路径字符

2024-05-08

我有一个声明性管道,应该执行 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 路径中的引号方面,我缺少什么?

Thanks


不要尝试引用${env:UNC} at all:

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

如果您确实需要escape " inside "...", use `" not \"; e.g.,
"Nat `"King`" Cole"逐字产生Nat "King" Cole- 继续读以获取更多信息。


  • 在 PowerShell 内部,\ has no特殊意义,相反,它是`(所谓的backtick) 用作转义字符,即在这些情况下:

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

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

      Get-Item C:\Program` Files # Note the escaped space char.
      
    • 注意`不仅用于表示将逐字使用下一个字符,还用作转义的开始序列代表控制字符并且,仅在 PowerShell (Core) 6+ 中,Unicode 字符;例如。,"`t"扩展为制表符,并且"`u{fc}" to ü。看概念图about_特殊_字符 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Special_Characters topic.

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

    • 例如,以下内容就可以正常工作:

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

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

      • 不幸的是,逐字传递论点embedded "从 PowerShell 7.1 开始,外部程序的字符仍然被破坏,尽管最终正在考虑修复 - 请参阅这个答案 https://stackoverflow.com/a/66837948/45375.

As for 你尝试过什么:

\ is not special in PowerShell (though it is needed to escape verbatim " chars. in arguments to the PowerShell CLI[1]).

所以,"\"${env:UNC}\"\"解析如下:

  • Argument 1:
    • "\"是一个带有逐字内容的双引号字符串\。由于带引号的字符串在开始时复合标记(即,如果直接后跟另一个带引号或不带引号的标记)本身始终被视为参数,该值将成为其自己的参数。这个值得注意的陷阱在这个答案 https://stackoverflow.com/a/66144160/45375.
  • Argument 2:
    • ${env:UNC}\扩展到环境变量的值UNC随后逐字逐句\
    • "\"又是一个带有逐字内容的双引号字符串\;因为它直接遵循unquoted token ${env:UNC}\,它被认为是一部分same争论。

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

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

<\>
<foo bar\\>

[1] This applies to powershell.exe, the Windows PowerShell CLI; pwsh, the PowerShell (Core) v6+ CLI, alternatively accepts ""- see this answer https://stackoverflow.com/a/68136129/45375 for more information.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins 中的 Powershell 转义路径字符 的相关文章

  • 在 powershell 3 中美化 json

    给定一个标准 json 字符串值 jsonString baz quuz cow moo cud foo bar 我怎样才能让这一切都漂亮的换行符 最好没有强力正则表达式 到目前为止我发现的最简单的方法是 jsonString Conver
  • Winform 启动后隐藏或最小化 powershell 提示符

    我编写了一个简单的 powershell 脚本来启动 winform 在 powershell 脚本中编写的 Winform 代码 例如 showContent ps1 文件 并显示一些内容 我需要在Winform启动后隐藏powershe
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G
  • 如何使用 PowerShell 捕获全局击键?

    Powershell 可以监听并捕获按键吗 是否可以编写一个 PowerShell 脚本 例如自动热键 https www autohotkey com 位于托盘中并等待您按下预定义的键盘键才开始执行 并且每次按下所述键时可能不会返回而是触
  • PowerShell:如何在名称为“*”(星号/星号)的文件/文件夹上创建选择器?

    我需要从 PS 修改注册表 此注册表项与特定文件 所有扩展的文件夹 的上下文菜单相关 HKEY CURRENT USER Software Classes 目前我想将项目添加到此路径 HKCU Software classes shell
  • 使用 PowerShell 批量复制和重命名文件

    我正在尝试使用 PowerShell 批量复制和重命名文件 原始文件名为AAA001A jpg AAB002A jpg AAB003A jpg等 我想用新名称复制文件 方法是从文件名中删除前四个字符以及句点之前的字符 以便复制的文件被命名为
  • 使用 Powershell 添加 IIS 8.5 自定义日志记录字段

    带有 IIS 8 5 的 Windows Server 2012 R2 允许使用增强型日志记录自定义日志字段 http www iis net learn get started whats new in iis 85 enhanced l
  • 使用 shell_exec 将 PHP 转换为 Powershell

    如果我运行 output shell exec powershell get service dhcp 我得到了 dhcp 服务的完美输出 显示正在运行 但如果我运行 output shell exec powershell get use
  • 通过快捷方式更改桌面的 Powershell 脚本

    关于为什么从 w in PS 运行时有效 但从定义为以下的快捷方式运行时无效的任何想法和建议 SystemRoot system32 WindowsPowerShell v1 0 powershell exe File C Users bi
  • 防止集成终端自动打开

    每当我在 VS Code 中打开 PowerShell 脚本时 集成终端就会打开 如何防止集成终端自动打开 我搜索了 终端 的设置 但没有发现与自动启动相关的内容 VSCode 会记住您的上一次会话 因此 如果关闭终端并退出 VSCode
  • 禁止非 PowerShell 命令的输出?

    我正在运行命令 hg st 然后检查它是 LASTEXITCODE检查当前目录中 Mercurial 的可用性 我不关心它的输出 也不想将它展示给我的用户 如何抑制所有输出 成功或错误 由于 Mercurial 不是 PowerShell
  • PowerShell 中转义反引号“`”和反斜杠“\”有什么区别?

    我知道两者都在 PowerShell 中使用 但用于不同的上下文 互联网上关于这个主题的信息很少 唯一谈论这个主题的网站 没有让我理解这个概念 是 https www rlmueller net PowerShellEscape htm h
  • Invoke-Sqlcmd 运行脚本两次

    我遇到了一个非常奇怪的问题并且可以重复 基本上 我使用invoke sqlcmd通过使用 inputfile来调用脚本文件 但是如果脚本文件存在一些执行错误 例如插入到列不应为空的表中 则脚本文件将被执行两次 我也可以从探查器中看到这两个执
  • 如何使用PowerShell脚本远程启动/停止IIS 6.0/7.0?

    我有两台服务器服务器 A 和服务器 B 我想使用 Powershell 脚本从服务器 B 远程停止服务器 A 最简单的方法之一就是使用命令行执行PsExec http www microsoft com technet sysinterna
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • 获取文件夹及其子文件夹中最长文件路径的长度

    我正在寻找一个可以从命令行 批处理 PowerShell 运行的脚本 该脚本将遍历文件夹及其子文件夹 并返回一个数字 该数字是最长文件路径的长度 我已经看到了一些批处理和 PowerShell 脚本 例如 如何在 Windows 中查找路径
  • Jenkins 管道构建如何确定工作区文件夹?

    在 Jenkins 管道中 当在特定节点上运行构建时 会在该代理上分配工作空间 我们没有设置工作空间路径 因此它是自动确定的 据我了解 当同一作业在同一代理上同时运行时 工作区必须包含执行程序编号以隔离构建 但是 工作空间路径到底是如何构建
  • Powershell:根据属性过滤属性

    我对 PowerShell 的自学经验有限 所以这可能是一些基本的东西 但我似乎无法正确理解 我在 Active Directory 中 需要提取电子邮件地址不以 SamAccountName 开头的用户列表 因此 如果您的登录名是 jdo
  • Rails escape_javascript 通过转义单引号创建无效的 JSON

    ActionView中的escape javascript方法转义撇号 作为反斜杠撇号 解析为 JSON 时会出错 例如 消息 我在这里 在打印时是有效的 JSON message I m here But 输出 I m here 导致无效
  • 使用 powershell 编辑 XML

    好吧 我感觉自己像个大白痴 为了工作中的管理目的 我使用 Powershell 已经有一段时间了 也就是说 编写脚本不是我的强项 现在 我正在尝试编写一个 PS 脚本 将一个部分添加到一堆机器上的 XML 中 以添加设置来解决我们在某个应用

随机推荐