gpt4 book ai didi

powershell - 如何在Azure DevOps中的Powershell内联脚本中正确连接字符串?

转载 作者:行者123 更新时间:2023-12-03 00:32:04 35 4
gpt4 key购买 nike

我尝试连接字符串以构造路径:

$SourceDirectoryPath = $(System.DefaultWorkingDirectory) + "/solution/project/bin/Debug"
$TargetFilePath = $(System.DefaultWorkingDirectory) + "/solution/project/bin/Debug/" + $(Release.ReleaseName) +$(Release.EnvironmentName)

但是我没有得到串联的字符串,而是在第二行得到了错误:

d:\a\r1\a : The term 'd:\a\r1\a' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At D:\a_temp\9de874c9-3acd-4a19-a4dd-763074d38e40.ps1:2 char:25



哪里 d:\a\r1\a显然是 $(System.DefaultWorkingDirectory),但是为什么它引发此错误而不是仅将字符串连接在一起?

最佳答案

注意:问题中的$(System.DefaultWorkingDirectory)是Azure Pipeline宏(变量),在PowerShell看到命令之前由Azure对其进行扩展-请勿与PowerShell自己的subexpression operator$(...)混淆。

Shayki Abramczyk's answer提供了有效的解决方案,但让我提供一些背景信息:

Azure通过宏$(...) 函数执行的值扩展(替代)功能类似于预处理程序:它将引用的属性替换为其逐字值

您需要确保此逐字值在目标命令的上下文中在语法上有效。

如目前所写:

$SourceDirectoryPath = $(System.DefaultWorkingDirectory) + "/solution/project/bin/Debug"



假定Azure属性System.DefaultWorkingDirectory的值为d:\a\r1\a',它将变成PowerShell看到的以下命令:
$SourceDirectoryPath = d:\a\r1\a + "/solution/project/bin/Debug"

这是一个损坏的PowerShell命令,因为d:\a\r1\a(由于缺少引号)被解释为命令名或路径;也就是说,尝试执行假定的可执行文件d:\a\r1\a-请参见 about_Parsing

因此,为了使PowerShell能够将Azure扩展值d:\a\r1\a识别为字符串,您需要将其引号-参见 about_Quoting_Rules

由于按天数扩展的值不需要进一步插值,因此单引号是的最佳选择(实际上,对于两个操作数):
$SourceDirectoryPath = '$(System.DefaultWorkingDirectory)' + '/solution/project/bin/Debug'

实际上,在您的情况下,根本不需要字符串连接(+):
$SourceDirectoryPath = '$(System.DefaultWorkingDirectory)/solution/project/bin/Debug'

您甚至可以将其与可扩展的PowerShell字符串("...")结合使用,只要Azure扩展的值不包含PowerShell最终可以解释的$前缀的 token (除非这是您的(异常)意图)。

一个警告类似于"$(System.DefaultWorkingDirectory)/$projectRoot/bin/Debug"(将Azure扩展值与PowerShell变量引用混合在一起)是 Azure的macro syntax($(...))看起来与PowerShell自己的subexpression operator 相同,通常是-但不是专门用于-以用于将表达式嵌入到可扩展的字符串中(例如,在纯PowerShell代码"1 + 1 equals $(1 + 1)"中)。

在撰写本文时,Define variables Azure帮助主题并未明确说明,而是基于official comment in a GitHub docs issue避免了歧义,如下所示:
  • 没有转义机制。相反,不引用Azure变量的$(...)构造将保持不变,并因此传递给PowerShell。
  • 在典型情况下,PowerShell表达式看起来不像Azure变量引用(例如$($foo.bar)而不是$(foo.bar)),尽管假设可能存在歧义:$(hostname)是有效的PowerShell子表达式,如果hostname Azure可以被Azure抢占变量已定义。
  • 在这种极端情况下,解决方案是避免使用内联脚本,而是将代码放在外部脚本文件中。
  • 关于powershell - 如何在Azure DevOps中的Powershell内联脚本中正确连接字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59860674/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com