Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins管道缺少用于工作Powershell命令的PropertyException_Powershell_Jenkins_Jenkins Pipeline - Fatal编程技术网

Jenkins管道缺少用于工作Powershell命令的PropertyException

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") }") 但

我正在尝试在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") }")
但是,这给了我以下例外情况:

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") }
"""
再次使用三重双引号形式允许您在字符串中自由嵌入
实例