我需要帮助,因为我在 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 一起使用吗?
您确实可以使用
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