我正在努力使用powershell来替换具有多行值的字符串。 该值来自Jenkins输入文本参数。所以这个值是一个多行字符串。
我使用powershell将{{BUILD_INFO_CHANGES}}替换为%BUILD_INFO_CHANGES%。
%BUILD_INFO_CHANGES%值为
-bug1
-bug 2
这是脚本:
powershell -Command "(gc %JOB_BUILD_DIR%\ThisBuildInfo.md) -replace '{{BUILD_INFO_CHANGES}}', '%BUILD_INFO_CHANGES%' | Out-File %JOB_BUILD_DIR%\ThisBuildInfo.md"
但是,我收到了Jenkins的错误回复。
' {{BUILD_INFO_FIXED_BUGS}}',<<<< ' - bug1缺少终结符:'。 ... + FullyQualifiedErrorId:TerminatorExpectedAtEndOfString d
我更改脚本并使用@来包装值。这是更改后的脚本。
powershell -Command "(gc %JOB_BUILD_DIR%\ThisBuildInfo.md) -replace '{{BUILD_INFO_CHANGES}}', @'%BUILD_INFO_CHANGES%'@ | Out-File %JOB_BUILD_DIR%\ThisBuildInfo.md"
我又出了一个错误。
FullyQualifiedErrorId:UnrecognizedToken
有人有解决方案吗?
谢谢!
答案 0 :(得分:0)
问题是将-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==
现在你有一些命令提示安全的东西。
答案 1 :(得分:0)
谢谢戴夫!你的解决方案给了我一个想法。
这是Jenkins最简单的解决方案。
我在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