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

Use and modify my variable in all startthreadjob powershell

提问人:Tazounet 提问时间:8/17/2023 最后编辑:Tazounet 更新时间:8/17/2023 访问量:35

问:

我需要帮助,因为我在 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 变量 范围 作业

评论

0赞 Walter Mitty 8/17/2023
阅读环境变量

答:

0赞 Mathias R. Jessen 8/17/2023 #1

您确实可以使用作用域修饰符来解析调用作用域中的变量引用,您只需要一个具有线程安全集合类型的变量即可写入: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

评论

0赞 Tazounet 8/17/2023
如果我想收集 foreach 循环的数组 $pingTable 中的所有 pc 名称为 true。我应该怎么做?
0赞 Mathias R. Jessen 8/17/2023
@Tazounet$reachableComputerNames = $pingTable.GetEnumerator() |Where-Object { $_.Value } |ForEach-Object Name
0赞 Tazounet 8/18/2023
非常感谢您的帮助,powershell 与 bash 确实不同。当我在 linux 下编写脚本时,我有基础知识,但我没有实践和 Windows 语法