【问题标题】:Different response upon multiple parameters对多个参数的不同响应
【发布时间】:2019-08-02 15:55:37
【问题描述】:

我无法解决问题:

  1. 使用 Jenkins / Groovy 脚本,我正在使用这些参数执行一个 ps1 文件:

    $myBuildTestNumber = "build-"+$env:BUILD_NUMBER;
    $rootDirectory = "\\\\myRootPath\\";
    $sn = "ibex.insight.reportrunner";
    Import-Module E:\\PSSDeployService.ps1 -ArgumentList $myBuildTestNumber,$rootDirectory,$sn
    
  2. .ps1 文件如下所示:

    Param(
        [Parameter(Position=0,Mandatory=$false)][string]$BuildNumber,
        [Parameter(Position=1,Mandatory=$false)][string]$rootDirectorys,
        [Parameter(Position=2,Mandatory=$false)][string]$serviceName
    )
    Import-Module E:\PSSDeployServiceModule.psm1
    # Here I am calling a function 'DeployServiceProc' from the .psm1 file with the parameters
    DeployServiceProc $rootDirectorys $BuildNumber $serviceName;
    
  3. 文件 .psm1 是这样的:

    function DeployServiceProc($rootDirectory, $BuildNumber, $serviceName) {
        function backupServiceFiles($rd,$bn,$sn) {
            "In Function 'backupServiceFiles'..."
            "rd: ${rd}";
            "Build Number: " + $bn;
            "Service Name: " + $sn;
            $serviceStatus = Get-Service $sn;
            "Service Status: " + $serviceStatus;
    
            if ($serviceStatus -eq 'Stopped') {
                #"Service is stopped, taking backup";
            }
        }
        Invoke-Command -ComputerName "myRemoteSystem.Name" -ScriptBlock ${function:backupServiceFiles} -ArgumentList $rootDirectory,$BuildNumber,$serviceName -Credential $Cred
    }
    

问题是: 如果我不提供三个参数,代码:

$serviceStatus = Get-Service $sn;

工作得很好。

但如果我提供所有三个参数,代码会返回:

服务状态:System.ServiceProcess.ServiceController

我无法确定我做错了什么。

【问题讨论】:

  • “不提供 3 个参数”是什么意思?你能举个例子说明both有效的调用和无效的调用吗?
  • 您能否尝试通过删除 ${rd} 变量周围的引号并重试来运行您的命令(可能这是使用时获得此输出的 3 个变量之一?):“rd : ${rd}"; "rd:" ${rd};对于某些类型的变量,使用引号输出的是变量类型,而不是变量的实际内容。
  • 考虑这个: function startService($sn) { "In Function 'startService'..." Start-Service $sn $maxRepeat = 20 $status = "Running" # 如果你想改成 Stopped等待服务启动 do { $count = (Get-Service $sn | ? {$_.status -eq $status}).count $count; $maxRepeat-- sleep -Milliseconds 1000 } 直到 ($count -eq 1 -or $maxRepeat -eq 0) }
  • 有趣的是,我正在复制一个工作函数并像问题代码一样对其进行修改,它工作得非常好。 function backupServiceFiles3($rd,$bn,$sn) { "在函数'backupServiceFiles3'..." $rd;十亿美元; $sn; $status = "停止";获取服务 $sn $count = (获取服务 $sn | ? {$_.status -eq $status}).count; $计数; #0 已停止,1 正在运行 if($count -eq 1) { "in 1st block: Stopped"; } elseif($count -eq 0) { "在第二块:运行"; } }
  • 好的,当你写 $serviceStatus = Get-Service $sn;你得到了整个对象,但如果我没记错的话你想显示状态?所以尝试下一行代码“服务状态:” + $serviceStatus.status;

标签: powershell jenkins parameter-passing


【解决方案1】:

您能否尝试通过删除 ${rd} 变量周围的引号并重试来运行您的命令(可能这是使用时获得此输出的 3 个变量之一?):

"rd: ${rd}";

"rd:" ${rd};

对于某些类型的变量,使用引号输出变量类型,而不是变量的实际内容。

编辑 1:

写好了

$serviceStatus = Get-Service $sn;

你得到了整个对象,但如果我没记错的话你想显示状态?

所以尝试下一行代码

"Service Status: " + $serviceStatus.status; 

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多