jenkins无法在程序文件下执行powershell

时间:2016-03-03 18:36:13

标签: powershell jenkins jenkins-plugins

我正在使用Jenkins进行部署。我想运行一个复制一些文件的powershell脚本。我为jenkins安装了“Windows Powershell”插件,它将执行powershell脚本。我的Powershell脚本如下所示

param (
     [string] $targetEnvironment,
     [switch] $WhatIf,
     [switch] $Compare)

    try
    {
       #do smething here
    }
    catch
    {
    }

当我手动执行它时,此脚本正常工作。但是,当在插件的输入窗口中使用以下命令运行脚本时,我会收到错误

enter image description here

请注意,如果我将“deploymentscript”文件夹复制到“C:\ deploymentscript”,然后在插件窗口中更改路径,那么作业运行正常。 它在程序文件

下执行时不起作用

我得到的错误是

First time build. Skipping changelog.
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "&   'C:\Users\CODESC~1\AppData\Local\Temp\hudson2119904511537985474.ps1'"
At C:\Users\username\AppData\Local\Temp\hudson2119904511537985474.ps1:1   char:119
+ ... etaTaskar.ps1' -targetEnvironment demo
+                    ~~~~~~~~~~~~~~~~~~
Unexpected token '-targetEnvironment' in expression or statement.
At C:\Users\username\AppData\Local\Temp\hudson2119904511537985474.ps1:1    char:138
+ ... getEnvironment demo
+                    ~~~~
Unexpected token 'demo' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken

Build step 'Windows PowerShell' marked build as failure
Finished: FAILURE

EDIT1
@petrik你是对的,导致问题的“Program Files(x86)”文件夹中的空格。解决方案是使用以下foormat

 &("C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\crconfig\deploymentscript\Deploy.ps1") -targetEnvironment demo

并且有效。

现在基于文章here如果powershell scrit失败了,我希望Jenkin的工作也失败了,  所以我告诉Hudson将powershell脚本称为windows批处理任务。

 powershell "& {&('C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\crconfig\deploymentscript\Deploy.ps1') -targetEnvironment $Env:EnvironmentParam; exit $lastexitcode }"

我不确定在我的情况下是否真的需要这个?

2 个答案:

答案 0 :(得分:1)

因此,在这种情况下,问题是由于“Program Files”路径中包含空格。将脚本的路径放入变量,然后可以使用call operator执行。

为了确保如果Powershell脚本失败,Jenkins会失败,需要采取几个步骤。

  1. 使用Jenkins powershell插件。它会将powershell退出代码传递给Jenkins
  2. 尽早将$ErrorActionPreference设置为“停止”。这会迫使Powershell在抛出异常时停止。默认行为是报告错误,然后继续。
  3. Jenkins配置中的脚本可能如下所示:

    $ErrorActionPreference = 'Stop'
    $scriptPath = 'c:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\crconfig\deploymentscript\deploy.ps1'
    & $script -targetEnvironment 'demo'
    

    这应该使Jenkins正确运行脚本并报告错误并在脚本失败时停止构建。

答案 1 :(得分:0)

我做了两件事来解决问题:

1)将powerscript“c:\ Users \\ Documents \ WindowsPowerShell \ profile.ps1”的路径附加到系统属性的路径变量。
2)打开具有管理权限的Powershell并执行:“Set-ExecutionPolicy Unrestricted”

然后重启windows机器。当我把它重新连接到jenkins时,我的powershell工作正常。