詹金斯管道MissingPropertyException工作Powershell命令

时间:2018-12-20 18:46:56

标签: powershell jenkins jenkins-pipeline

我正在尝试在我的Jenkins Pipeline版本中运行此工作脚本:

powershell(returnStdout: true, script: "gci -path "c:/jenkins/workspace/testdata" -recurse | where-object{ $_.Name -like "*testconfig.staging.json*"} | %{rename-item $_.FullName $_.FullName.Replace("staging","local") }")

但这给了我以下例外:

java.lang.ClassCastException: org.jenkinsci.plugins.workflow.steps.EchoStep.message expects class java.lang.String but received class groovy.lang.MissingPropertyException

我尝试分割命令以查看失败的地方,并且在尝试将输出通过管道传输到where-object时似乎发生了。

如果我只是运行此命令:

powershell(returnStdout: true, script: "gci -path "c:/jenkins/workspace/testdata" -recurse ")

然后输出结果,我实际上得到了该目录中文件夹的列表。

对这一步骤的失败原因有任何想法吗?

1 个答案:

答案 0 :(得分:2)

您的问题是您忽略了"个字符。 嵌入(嵌套)在整个"..."中,并用引号括起来的命令字符串为\"

  

powershell(returnStdout: true, script: "gci -path "c:\jenkins\..." .... "

                                                   ^              ^ must be \-escaped

但是,鉴于您没有尝试在脚本中引用变量值,一个简单的解决方法是使用'...'作为整体引号,其中{{1 }}可以使用进行转义:

"

为获得更大的灵活性,您可以使用三重单引号字符串(通常用于定义多行字符串文字),在其中您可以自由使用powershell returnStdout: true, script: 'gci -path "c:/jenkins/workspace/testdata" -recurse | where-object{ $_.Name -like "*testconfig.staging.json*"} | %{rename-item $_.FullName $_.FullName.Replace("staging","local") }' '实例无需逃避:

"

请注意,开头powershell returnStdout: true, script: ''' gci -path "c:/jenkins/workspace/testdata" -recurse | where-object{ $_.Name -like "*testconfig.staging.json*"} | %{rename-item $_.FullName $_.FullName.Replace("staging","local") } ''' 之后和结尾'''之前的换行符(换行符)成为字符串的一部分,但是在将字符串解释为PowerShell源代码的上下文中没有区别


如果您确实想将Groovy变量或表达式并入命令字符串:

  • 必须使用双引号字符串
  • 并通过'''
  • 嵌入Groovy变量引用/表达式
  • 并转义所有打算由 PowerShell 解释为${...}的{​​{1}}实例。

例如,要在$调用中使用Groovy变量\$

$variable

再次使用三重双引号格式,可以将.Replace()实例自由地嵌入字符串中。