Powershell命令 - 具有多行值的替换

时间:2015-08-27 16:18:21

标签: powershell

我正在努力使用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

有人有解决方案吗?

谢谢!

2 个答案:

答案 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