gpt4 book ai didi

powershell - 在 Foreach 之前加速测试连接

转载 作者:行者123 更新时间:2023-12-02 23:28:45 25 4
gpt4 key购买 nike

我制作了一个脚本来检查用户桌面文件夹是否在 cuota 限制下,如果他们在 cuota 限制下,则备份到服务器将正确完成。

每个用户都有他的电脑,所以源 CSV 看起来像:

pc1,user1
pc2,user2
pc800,user800

有些计算机是 Windows Xp 和一些 W7,路径可能不同,因为我使用的是 Test-Path
W7 = C:\users\$user\desktop
XP = C:\document and settings\$user\desktop

但是测试路径 super 慢,我开始在每个测试路径之前使用一个 Test-Connection -count 1

无论如何,脚本仍然很慢,在每次“bad ping test”中我都会浪费很多时间。

代码:
$csvLocation = '~\desktop\soourceReport.csv'
$csv = import-csv $csvLocation -Header PCName, User

$OuputReport = '~\desktop\newReport.csv'

# info:
# "209715200" Bytes = 200 MB

$cuota = "209715200"
$cuotaTranslate = "$($cuota / 1MB) MB"
Write-Host "Cuota is set to $cuotaTranslate"

$count=1

foreach($item in $csv)
{
write-host "$count# Revisando" $item.User "en" $item.PCName "..." #For debug

if (Test-Connection -Quiet -count 1 -computer $($item.PCname)){

$w7path = "\\$($item.PCname)\c$\users\$($item.User)\desktop"
#echo $w7path #debug

$xpPath = "\\$($item.PCname)\c$\Documents and Settings\$($item.User)\Escritorio"
#echo $xp #debug

if(Test-Path $W7path){

$desktopSize = (Get-ChildItem -Recurse -force $w7path | Measure-Object -ErrorAction "SilentlyContinue" -property length -sum)

write-host -ForegroundColor Green "access succeed"

if($($desktopSize.sum) -gt $cuota){


$newLine = "{0},{1},{2}" -f $($item.PCname),$($item.User),"$("{0:N0}" -f $($desktopSize.sum / 1MB)) MB"
$newLine | add-content $outputReport

Write-Host -ForegroundColor Yellow "cuota exceeded! -- added"
}

else{
Write-Host -ForegroundColor DarkYellow "cuota OK"
}


}

elseif(Test-Path $xpPath){

$desktopSize = (Get-ChildItem -Recurse -force $xpPath | Measure-Object -ErrorAction "SilentlyContinue" -property length -sum)

write-host -ForegroundColor Green "access succeed"

if($($desktopSize.sum) -gt $cuota){


$newLine = "{0},{1},{2}" -f $($item.PCname),$($item.User),"$("{0:N0}" -f $($desktopSize.sum / 1MB)) MB"
$newLine | add-content $outputReport

Write-Host -ForegroundColor Yellow "cuota exceeded! -- added"
}

else{
Write-Host -ForegroundColor DarkYellow "cuota OK"
}
else{
write-host -ForegroundColor Red "Error! - bad path"
}
}

else{
write-host -ForegroundColor Red "Error! - no ping"
}
$count++
}
Write-Host -ForegroundColor green -BackgroundColor DarkGray "All done! new report stored in $report"

为了改进它,在第一次提到的 SLOW-Foreach 循环之前,我使用另一个 Foreach 将所有计算机存储在一个 $list 中。
foreach($pcs in $csv){

$alivelist += @( $pcs.PCName )
}

Test-Connection -quiet -count 2 -computer $alivelist

现在,我现在不知道如何在进入第二个 Foreach 之前从 SOURCE CSV 更新或删除行(“dead” pc、user)。

我需要你的一些“魔法”,或者至少一些想法!

谢谢

最佳答案

为了加快您的脚本,您需要并行运行检查(正如其他人已经提到的那样)。将您的支票和工作人员代码放在一个脚本 block 中:

$sb = {
Param($computer, $username)

if (Test-Connection -Quiet -Count 2 $computer) { return }

$w7path = "\\$computer\c$\users\$username\desktop"
$xpPath = "\\$computer\c$\Documents and Settings\$username.TUITRA..."

if (Test-Path $W7path) {
#...
} elseif (Test-Path $xpPath) {
#...
} else {
#...
}
}

然后将脚本 block 作为并行作业运行:
$csv | ForEach-Object {
Start-Job -ScriptBlock $sb -ArgumentList $_.PCName, $_.User
}

# wait for completion
do {
Start-Sleep -Milliseconds 100
} while (Get-Job -State 'Running')

# cleanup
Get-Job | ForEach-Object {
Receive-Job -Id $_.Id
Remove-Job -Id $_.Id
} | Out-File $outputReport

使用 queue如果您需要限制并行作业的数量。

关于powershell - 在 Foreach 之前加速测试连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com