Проблема объема счетчика достижений Powershell - удаленный сброс настроек отслеживания сеанса - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь отслеживать прогресс, и я думаю, что это проблема масштаба. Эти две функции находятся в Functions.ps1 и вызываются из другого скрипта main.ps1. Прогресс отслеживается нормально, пока не получит команду invoke в функции 1. Почему удаленный сеанс сбрасывает трекер прогресса? Вот как выглядят код и вывод:

main.ps1

. "C:\Functions.ps1" #dot source so functions available
$steps = 10
Write-ProgressHelper -stepTotal $steps -Status "reset"

Functions.ps1

Function Write-ProgressHelper {
    param (
        [int]$stepTotal,
        [string]$Status
    )
   Switch ($Status)
   {
    "run" {
        $global:Counter++
        Write-Host "$Counter"
        Write-Progress -Activity "STIG" -PercentComplete (($Counter / $stepTotal) * 100)
     }
    "reset" {
        $Counter = 0
        Write-Host "Counter Reset"
    }
  }
}

Function 1 {
    Write-Host "StepNumber:1"
    Write-ProgressHelper -stepTotal $steps -Status "run"

    #some code here
    Write-Host "StepNumber:2"
    $sysinfo = { 

        . "C:\Functions.ps1" #dot source so write-progresshelper is available within invoke-command

        #more code
        Write-Host "StepNumber:3"
        Write-ProgressHelper -stepTotal $using:steps -Status "run"
        Write-Host "StepNumber:4"
        #more code
        Write-ProgressHelper -stepTotal $using:steps -Status "run"

    }#end sysinfo
    Invoke-Command -ComputerName $Servers -ScriptBlock $sysinfo
    Write-Host "StepNumber:10"
    Write-ProgressHelper -stepTotal $using:steps -Status "run"
}#end Function 1

В функции 1 отслеживается 10 шагов, и затем я вывожу переменную $ counter Шаги 1, 2 и 10 находятся в пределах функции 1. Шаги 3-9 находятся в сеансе вызова команды. Я попытался объявить счетчик глобальным, и это не сработало (я сделал так, чтобы он объявлялся с областью действия скрипта, чтобы он вообще увеличивался). Вот вывод:

StepNumber:1
1
StepNumber:2
2
StepNumber:3
1
StepNumber:4
2
StepNumber:5
3
StepNumber:6
4
StepNumber:7
5
StepNumber:8
6
StepNumber:9
7
StepNumber:10
3

1 Ответ

0 голосов
/ 23 апреля 2020

Удаленные переменные не сохраняются обратно в локальные переменные (см .: about_Remote_Variables ). Таким образом, даже если вы определили $counter как $global переменную, в рамках сеанса PowerShell это только глобально в . не доступно на удаленном компьютере. Когда вызывается Invoke-Command, новый сеанс PowerShell создается на этом компьютере , и $counter сбрасывается в 0. Он будет увеличиваться и возвращаться. Существующее значение переменной $counter на локальном компьютере сохраняется и продолжается.

Когда мы посмотрим, каково значение $global:Counter, мы должны понимать, что переменная доступна только на компьютер, на котором выполняется сценарий:

                 Local Computer    Server1            
                 ----------------- -------------------
                 $global:Counter   $global:Counter    
                 _________________ ___________________
StepNumber:1      1                (0)                
1
StepNumber:2      2                (0)                
2                       
    Invoke-Command -Computer Server1
                  |---------------->         
StepNumber:3     (2)                1                 
1
StepNumber:4     (2)                2                 
2
StepNumber:5     (2)                3                 
3
StepNumber:6     (2)                4                 
4
StepNumber:7     (2)                5                  
5
StepNumber:8     (2)                6                  
6
StepNumber:9     (2)                7                  
7
                  <-----------------|

StepNumber:10     3
3

Посмотрите, как увеличивается значение $global:Counter для шагов 1 и 2. При запуске Invoke-Computer PowerShell создает новый сеанс PowerShell на удаленном компьютере. компьютер, где значение $global:Counter равно 0. Вот почему вы видите значение, по-видимому, «сброс». После выполнения шагов 3-9 процесс возвращается на локальный компьютер, где значение $global:Counter равно 2. Поэтому для шага 10 видно, что он возвращает 3.

Чтобы иметь эффективный счетчик вам нужно будет передать значение счетчика в Invoke-Command как AgrumentList и вернуть значение обратно.

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