Jenkins 到 Powershell - 我需要在传递的参数中转义美元符号吗?

问题描述 投票:0回答:2

我有一个 Jenkins 管道,它通过 Powershell 插件调用 Powershell 脚本。该管道使用 withCredentials 将 Powershell 在 SQL 连接中使用的用户/密码放入变量中。我将它们作为命令的属性传递:

def psCmd="./Set-CheckmarxTeams -server ${server} -jkuser $sqluser -jkpass $sqlpass"

脚本将它们定义为参数:

param ([string]$server='ad1hfddbst930\shared',[string]$jkuser,[string]$jkpass)

但是使用

$jkuser
$jkpass
的 SQL 连接失败。密码中间有一个
$
。我尝试了
Write-Host $jkpass
,但它只显示了
$
之前的部分,但之后什么也没有。在传递字符串之前我需要修改它吗?如果是的话,怎么办?

powershell escaping jenkins-pipeline
2个回答
1
投票

“逃避”美元符号很容易,也很容易知道。在本例中,@Richard Schaefer 需要传递包含美元符号的整个密码字符串。

将字符串存储在

$jkpass
变量中,如下所示:

$jkpass = "thisisa$password"

将输出:

thisisa

因此,用单引号存储密码可以消除此问题。

$jkpass = 'thisisa$password'

输出:

thisisa$password


0
投票

接受的答案是正确的,但在这种情况下我们在 Jenkins 中遇到了其他问题。例如,如果使用值字符串中包含 $ 字符的属性或环境变量,则必须首先在 Jenkins 中使用 \ 字符转义 $,例如

password=thisisa$password

变成-

password=thisisa\$password

这将允许 Jenkins 将完整的变量值按原样传递到脚本块中,并且不会截断第一个 $ 之前的值(它会这样做)。

但是由于 \ 不是 PowerShell 中的转义字符,因此您需要删除已添加的 \ 字符才能恢复到原始值。

例如

$originalPassword = $env:password.replace("\$","$")

如果有人有更好的解决方案,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.