我正在尝试在我的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 ")
然后输出结果,我实际上得到了该目录中文件夹的列表。
对这一步骤的失败原因有任何想法吗?
答案 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变量或表达式并入命令字符串:
'''
${...}
的{{1}}实例。例如,要在$
调用中使用Groovy变量\$
:
$variable
再次使用三重双引号格式,可以将.Replace()
实例自由地嵌入字符串中。