提问人:Tazounet 提问时间:8/17/2023 最后编辑:Tazounet 更新时间:8/17/2023 访问量:35
在所有 startthreadjob PowerShell 中使用和修改我的变量
Use and modify my variable in all startthreadjob powershell
问:
我需要帮助,因为我在 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一起使用吗?
答:
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 语法
评论