首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell进度计数器范围问题-远程会话重置进度跟踪器

Powershell进度计数器范围问题-远程会话重置进度跟踪器
EN

Stack Overflow用户
提问于 2020-04-23 20:07:23
回答 1查看 111关注 0票数 0

我正在努力跟踪进展,我认为这是一个范围问题。这两个函数位于Functions.ps1中,并从另一个脚本main.ps1调用。进程被很好地跟踪,直到得到函数1中的调用命令。为什么远程会话重置进度跟踪器?下面是代码和输出的样子:

main.ps1

代码语言:javascript
复制
. "C:\Functions.ps1" #dot source so functions available
$steps = 10
Write-ProgressHelper -stepTotal $steps -Status "reset"

Functions.ps1

代码语言:javascript
复制
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在调用命令会话中.我试图将计数器声明为全局计数器,但这不起作用(我让它使用脚本范围声明,以便使其完全增值)。这是输出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 20:55:55

远程变量不会保存回局部变量(请参阅:变量)。因此,即使您将$counter定义为一个$global变量,它也只是该PowerShell会话中的全局变量。远程计算机上可用的是而不是。当调用Invoke-Command时,将在该计算机上创建一个新的PowerShell会话,并将$counter重置为0。它会增加并返回。本地计算机上的$counter变量的现有值被保留,并继续进行。

当我们查看$global:Counter的值时,我们必须意识到变量仅在脚本正在执行的计算机上可用:

代码语言:javascript
复制
                 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

查看步骤1和步骤2如何增加$global:Counter的值。当运行Invoke-Computer时,PowerShell在远程计算机上创建一个新的PowerShell会话,其中$global:Counter的值为0。这就是为什么你看到的值显然是“重置”。执行步骤3-9之后,进程返回到本地计算机,其中$global:Counter的值仍然是2,这就是为什么在步骤10中,它返回3。

要有一个有效的计数器,您必须将计数器值作为一个Invoke-Command传递给AgrumentList并返回该值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61396086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档