我正在努力跟踪进展,我认为这是一个范围问题。这两个函数位于Functions.ps1中,并从另一个脚本main.ps1调用。进程被很好地跟踪,直到得到函数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发布于 2020-04-23 20:55:55
远程变量不会保存回局部变量(请参阅:变量)。因此,即使您将$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查看步骤1和步骤2如何增加$global:Counter的值。当运行Invoke-Computer时,PowerShell在远程计算机上创建一个新的PowerShell会话,其中$global:Counter的值为0。这就是为什么你看到的值显然是“重置”。执行步骤3-9之后,进程返回到本地计算机,其中$global:Counter的值仍然是2,这就是为什么在步骤10中,它返回3。
要有一个有效的计数器,您必须将计数器值作为一个Invoke-Command传递给AgrumentList并返回该值。
https://stackoverflow.com/questions/61396086
复制相似问题