Jenkins管道缺少用于工作Powershell命令的PropertyException
我正在尝试在Jenkins管道构建中运行此工作脚本:Jenkins管道缺少用于工作Powershell命令的PropertyException,powershell,jenkins,jenkins-pipeline,Powershell,Jenkins,Jenkins Pipeline,我正在尝试在Jenkins管道构建中运行此工作脚本: 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") }")
但是,这给了我以下例外情况:
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 ")
然后输出结果,我确实得到了该目录中的文件夹列表
你知道这一步失败的原因吗?你的问题是你忽略了转义
“
字符。嵌入(嵌套)在你的整个“…”
-引用的命令字符串为\”
powershell(returnStdout:true,脚本:“gci-path”c:\jenkins\…”
但是,考虑到您不想在脚本中引用Groovy变量值,一个简单的解决方法是使用“…”
作为整体引用,其中“
可以在不转义的情况下使用:
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 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变量或表达式合并到命令字符串中:
- 必须使用双引号字符串
- 并通过
${…}
- 并转义所有那些被PowerShell解释为
的\$
实例$
.Replace()
调用中使用Groovy变量$variable
:
powershell returnStdout: true, script: """
gci -path "c:/jenkins/workspace/testdata" -recurse |
where-object { \$_.Name -like "*testconfig.staging.json*" } |
% { rename-item \$_.FullName \$_.FullName.Replace("${variable}","local") }
"""
再次使用三重双引号形式允许您在字符串中自由嵌入“
实例