Мой первый параметр не передается в мою функцию - PullRequest
0 голосов
/ 18 июня 2019

У меня есть задание Jenkins, которое вызывает скрипт PowerShell с некоторыми параметрами.Параметрами всегда являются запуск / останов, а затем количество включенных / выключенных тестовых машин на селен.Примеры:

powershell.exe -File gridControl.ps1 start grid1 grid2 grid3
powershell.exe -File gridControl.ps1 stop grid4 grid6 grid7

Сценарий недавно работал нормально, пока нас не попросили добавить тайм-аут, так как иногда его часть зависала.Проблема в том, что для добавления времени ожидания мы инкапсулировали все это в функцию, чтобы мы могли запустить ее как задание и рассчитать время.

Это означает, что нам также необходимо было проанализировать аргументы в функции.Я сделал это после передачи переменной Powershell в start-job

Моя проблема в том, что моя первая переменная потерялась.Вот код (который не включает фактический запуск / останов машины. Он просто подключается к VCS и пытается распечатать мои аргументы):

Write-Host " gridControl - Started"
$timeoutSeconds = 60
$code =  
{
    param($args)
    $vcenter = "vc-3dc-v01.redacted.local"
    $delaysec = 120
    $toolsdelayCheck = 30
    $looprepeats = 10
    $toolsrunningDelay = 60
    $emailTo = @('redacted@zetta.bg', 'redacted@finanalytica.com')

    Write-Host " Connecting to VCenter..."

    Add-PSSnapin VMware.VimAutomation.Core -WarningAction SilentlyContinue | Out-Null
    Connect-VIServer -Server $vcenter -WarningAction SilentlyContinue -Verbose

    if(!$?){
        Write-Host "Could not connect to VCenter"
    }
    else{
        Write-Host "Successfully connected to vCenter"
    }

    Write-Host $args[0]
    Write-Host $args[1] $args[2] $args[3]

    Write-Host " gridControl - Ready to finish"
    Disconnect-VIServer -Server $vcenter -Confirm:$false -Force:$true -WarningAction SilentlyContinue -ErrorAction SilentlyContinue

    Write-Host " VIServer Disconnected"
    Remove-PSSnapin VMware.VimAutomation.Core
}
$j = Start-Job -ScriptBlock $code -Arg $args

Write-Host " cp2"
if (Wait-Job $j -Timeout $timeoutSeconds) { Receive-Job $j }
Write-Host " cp3"

Remove-Job -force $j
Write-Host " gridControl - Terminate"

Важным является вывод, который я получаю с

Write-Host $args[0]
Write-Host $args[1] $args[2] $args[3]

Что такое:

15:05:49 grid1
15:05:49 grid2 grid3 

Когда должно быть

15:05:49 start
15:05:49 grid1 grid2 grid3

Есть идеи, почему это так?

1 Ответ

5 голосов
/ 18 июня 2019

Ссылочные элементы в массиве $args напрямую. Вам не нужен этот param($args) оператор в верхней части скрипта.

Упрощенный пример ...

$things = @(1, 2, 3);
$script = {
    Write-Host $args[0]
    Write-Host $args[1]
}

foreach ($thing in $things) {
    Start-Job -ScriptBlock $script -ArgumentList $thing, ($thing * 3) -Name "Job-${thing}"
}

Receive-Job -Name "Job-1"
Receive-Job -Name "Job-2"
Receive-Job -Name "Job-3"

Если вы запустите это в своей оболочке, вы увидите, что я получаю оба параметра.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...