Powershell命令-替换为多行值
我正在努力使用powershell将字符串替换为多行值。 该值来自Jenkins输入文本参数。所以这个值是一个多行字符串 我使用powershell将{{BUILD\u INFO\u CHANGES}}替换为%BUILD\u INFO\u CHANGES% %BUILD\u INFO\u CHANGES%值为 -bug1 -错误2 以下是脚本:Powershell命令-替换为多行值,powershell,Powershell,我正在努力使用powershell将字符串替换为多行值。 该值来自Jenkins输入文本参数。所以这个值是一个多行字符串 我使用powershell将{{BUILD\u INFO\u CHANGES}}替换为%BUILD\u INFO\u CHANGES% %BUILD\u INFO\u CHANGES%值为 -bug1 -错误2 以下是脚本: powershell -Command "(gc %JOB_BUILD_DIR%\ThisBuildInfo.md) -replace '{{BUILD
powershell -Command "(gc %JOB_BUILD_DIR%\ThisBuildInfo.md) -replace '{{BUILD_INFO_CHANGES}}', '%BUILD_INFO_CHANGES%' | Out-File %JOB_BUILD_DIR%\ThisBuildInfo.md"
然而,我从詹金斯那里得到了错误响应
“{BUILD_INFO_FIXED_BUGS}}”,问题是将
-Command
参数用于除简单脚本以外的任何其他脚本,您将遇到诸如花括号和引号之类的字符在传递给PowerShell之前会被命令提示符错误解释的问题。您可以通过添加几层转义将自己绑在一起,或者有一种更简单的方法—使用-EncodedCommand
参数
对于-EncodedCommand
,您只需要对命令进行Base64编码,您可以使用以下PowerShell脚本执行此操作:
$command = @'
# Enter your commands containg curly braces and quotes here
# As long as you like
'@
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes) | clip.exe
这会将编码的命令复制到剪贴板,然后使用命令所需的全部操作是键入:
powershell.exe -EncodedCommand
。。然后粘贴到命令中,这样您就可以得到如下结果:
powershell.exe -EncodedCommand IAAgACMAIABFAG4AdABlAHIAIAB5AG8AdQByACAAcwBjAHIAaQBwAHQAIABjAG8AbgB0AGEAaQBuAGcAIABjAHUAcgBsAHkAIABiAHIAYQBjAGUAcwAgAGEAbgBkACAAcQB1AG8AdABlAHMACgAgACAAIwAgAEEAcwAgAGwAbwBuAGcAIABhAHMAIAB5AG8AdQAgAGwAaQBrAGUAIAAgAA==
您现在有了命令提示符安全的东西。谢谢Dave!你的解决方案给了我一个想法 下面是处理詹金斯的最简单的解决方案 在Jenkins构建作业中,我将以下脚本放在Powershell构建步骤中
$thisBuildInfoPath="$env:JOB_BUILD_DIR\ThisBuildInfo.md"
$fixedBugs=@("$env:BUILD_INFO_FIXED_BUGS")
(gc $thisBuildInfoPath) -replace "{{BUILD_INFO_FIXED_BUGS}}", $fixedBugs | sc $thisBuildInfoPath
这看起来像是CMD没有正确扩展多行变量。我建议您通过PowerShell引用环境变量,而不是通过CMD展开它们。顺便说一句,
{
和}
对于正则表达式有特殊的意义,因此需要进行转义才能进行字面解释。
$thisBuildInfoPath="$env:JOB_BUILD_DIR\ThisBuildInfo.md"
$fixedBugs=@("$env:BUILD_INFO_FIXED_BUGS")
(gc $thisBuildInfoPath) -replace "{{BUILD_INFO_FIXED_BUGS}}", $fixedBugs | sc $thisBuildInfoPath