Azure devops Azure DevOps管道失败,因为密码带有特殊字符

Azure devops Azure DevOps管道失败,因为密码带有特殊字符,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,我正在使用azure devops构建project server解决方案 在我的发布管道中,我有多个powershell脚本,它们要求用户凭据作为参数。密码保存在DevOps中的一个秘密变量中,并包含一个引号 Password: abcd'efgh 这导致管道抛出错误:“字符串缺少终止符:” 当我用双引号将密码硬编码到管道中时,脚本执行得非常完美 Argument: -password "abcd'efgh" 当我将DevOps secret变量放在双引号中时,脚本会执行,但在尝试在服务器

我正在使用azure devops构建project server解决方案

在我的发布管道中,我有多个powershell脚本,它们要求用户凭据作为参数。密码保存在DevOps中的一个秘密变量中,并包含一个引号

Password: abcd'efgh
这导致管道抛出错误:“字符串缺少终止符:”

当我用双引号将密码硬编码到管道中时,脚本执行得非常完美

Argument: -password "abcd'efgh"
当我将DevOps secret变量放在双引号中时,脚本会执行,但在尝试在服务器上进行身份验证时会出现错误,可能是因为传递的密码是“***”

下面是由管道执行的脚本的相关部分。非常感谢您的帮助

param(
  $siteUrl,
  $username,
  $password
)
$encpassword = convertto-securestring -String $password -Force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
Connect-PnPOnline -Url $siteUrl -Credentials $cred

如何将密码输入脚本?

您面临的问题是
$(passwordVariable)
变量引用在脚本主体中展开,然后由Powershell执行。这意味着Powershell会看到变量值并解释其中的特殊字符。 您可以使用Powershell转义字符(
`
)在所有特殊字符前面加上前缀,但这并不十分优雅

访问脚本中变量的一种更安全的方法是通过env variables—您在管道中设置的每个变量(名称是大写的,
替换为
\ucode>)

对于常规(非加密)变量,您应该:

Do-Something -password "$($env:PASSWORDVARIABLE)"
对于机密(加密)变量,您必须为其环境变量编写脚本。在经典管道中,使用
环境
部分。在yaml中,它将如下所示:

- pwsh: |
    Do-Something -Password $($env:MAPPED_PASSWORD)
  env:
    MAPPED_PASSWORD: $(passwordVariable)

有一个警告:不要在映射变量前面加上
SECRET\ucode>——这不会起作用,因为这个前缀是由DevOps内部使用的。

看看这个扩展:这可能是useful@redleo85我面临着完全相同的情况。你曾经解决过这个问题吗(没有使用市场扩展)?我对
@
符号也有同样的问题<代码>”myname@here.com“
转换为
”***“
。如果我删除了域信息,就可以了,
“myname”
仍然是
“myname”
- pwsh: |
    Do-Something -Password $($env:MAPPED_PASSWORD)
  env:
    MAPPED_PASSWORD: $(passwordVariable)