我有一个 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
,但它只显示了$
之前的部分,但之后什么也没有。在传递字符串之前我需要修改它吗?如果是的话,怎么办?
“逃避”美元符号很容易,也很容易知道。在本例中,@Richard Schaefer 需要传递包含美元符号的整个密码字符串。
将字符串存储在
$jkpass
变量中,如下所示:
$jkpass = "thisisa$password"
将输出:
thisisa
因此,用单引号存储密码可以消除此问题。
$jkpass = 'thisisa$password'
输出:
thisisa$password
接受的答案是正确的,但在这种情况下我们在 Jenkins 中遇到了其他问题。例如,如果使用值字符串中包含 $ 字符的属性或环境变量,则必须首先在 Jenkins 中使用 \ 字符转义 $,例如
password=thisisa$password
变成-
password=thisisa\$password
这将允许 Jenkins 将完整的变量值按原样传递到脚本块中,并且不会截断第一个 $ 之前的值(它会这样做)。
但是由于 \ 不是 PowerShell 中的转义字符,因此您需要删除已添加的 \ 字符才能恢复到原始值。
例如
$originalPassword = $env:password.replace("\$","$")
如果有人有更好的解决方案,请告诉我。