在所有startthreadjob powershell中使用和修改我的变量

问题描述 投票:0回答:1

我需要帮助,因为我在 powershell 作业中使用变量时遇到问题。

我来解释一下吧

我想创建一个计数器来检索 ping OK 的次数

foreach($computer in $computers)
{
    Start-ThreadJob -ThrottleLimit 100 -ScriptBlock {
        if (Test-Connection $using:computer -count 1 -TimeoutSeconds 2 -Quiet)
        {
            $test_con = $test_con+1
        }
    }
}

write-host $test-con

我使用 $using 范围在启动线程作业中获取 $computer 变量没有问题。 但我无法在每次测试连接为真时增加 test_con 变量,以最终获得 ping 的机器数量。

我想从作业中增加我的全局变量“test_con”

我使用的是powershell 7,我从来没有在bash linux下问过自己这个问题

有人可以向我解释一下它如何与 powershell 一起使用吗?

powershell variables scope jobs
1个回答
0
投票

您确实可以使用

using
范围修饰符来解析调用范围中的变量引用,您只需要一个具有线程安全集合类型的变量来写入:

# Create a hashtable
$counterTable = @{}

# Make it thread-safe
$counterTable = [hashtable]::Synchronized($counterTable)


foreach($computer in $computers) {
    Start-ThreadJob -ThrottleLimit 100 -ScriptBlock {
        if (Test-Connection $using:computer -count 1 -TimeoutSeconds 2 -Quiet)
        {
            $counter = $using:counterTable
            $counter['ping'] += 1
        }
    }
}

Write-Host "We had $($counterTable['ping']) successful pings!"

我个人更喜欢知道哪些计算机可以成功ping通,所以我建议将

Test-Connection
结果存储在表中的单独条目中:

# Create a hashtable
$pingTable = @{}

# Make it thread-safe
$pingTable = [hashtable]::Synchronized($pingTable)

foreach($computer in $computers) {
    Start-ThreadJob -ThrottleLimit 100 -ScriptBlock {
        $pingTable = $using:pingTable
        $computerName = $using:computer
    
        $pingTable[$computerName] = Test-Connection $using:computer -Count 1 -TimeoutSeconds 2 -Quiet
    }
}

Write-Host "We had $($pingTable.psbase.Values.Where({!$_}).Count) failures!"
$pingTable.GetEnumerator() |Sort Name |Format-Table |Out-Host
© www.soinside.com 2019 - 2024. All rights reserved.