Powershell 使用foreach循环写入进度问题
也许这是一个非常简单的答案。我在工作中很难取得写作进度。我很确定问题出在我的变量上,但我似乎不知道到底是什么 它现在所做的是在第一次运行时,在没有任何输出文件的情况下进行轰炸。它会告诉我:Powershell 使用foreach循环写入进度问题,powershell,active-directory,foreach,Powershell,Active Directory,Foreach,也许这是一个非常简单的答案。我在工作中很难取得写作进度。我很确定问题出在我的变量上,但我似乎不知道到底是什么 它现在所做的是在第一次运行时,在没有任何输出文件的情况下进行轰炸。它会告诉我: 写入进度:无法验证参数“PercentComplete”上的参数。300 ar gument大于最大允许范围100。提供一个 小于100,然后重试该命令。 它提到的“300参数”每次都是一个不同的随机数 现在,如果我在livepcs.txt存在的情况下再次运行脚本,它可能会工作,也可能不会工作。即使如此,进度
写入进度:无法验证参数“PercentComplete”上的参数。300 ar
gument大于最大允许范围100。提供一个
小于100,然后重试该命令。
它提到的“300参数”每次都是一个不同的随机数
现在,如果我在livepcs.txt存在的情况下再次运行脚本,它可能会工作,也可能不会工作。即使如此,进度条也会从一半开始
这是我第一次尝试让编写进度正常工作,所以可能很简单,但我还不太确定要寻找什么。如果您能提供任何建议,我们将不胜感激
最终代码:
#Import active directory module
Import-Module active*
#Query AD for all computers by name filter, AND that have an IP listed in AD, store in variable (use line 10)
$PCs = Get-ADComputer -Properties * -Filter {name -like "PCNameDomainPrefix*"} | Where-Object {$_.Ipv4Address -ne $null} | select name,ipv4address
#Dump list of PCs into CSV
$PCs | Export-Csv c:\script\pcs.csv
#Begin foreach loop to see which servers are alive
$i = 0
$livePCs = ForEach($name.name in $PCs) #specify the name string using .name after the variable
{
$entry = Test-Connection $name.name -count 1 -quiet #Test-connection pings. The -quiet parameter forces a boolean result (True/False).
if ($entry -eq "True") {out-file -InputObject $name.name -Encoding ASCII -Width 50 -Append c:\script\livepcs.txt ; Write-Host "$name.name pings"}
else { write-host "server $name could not be contacted"}
$i++
Write-Progress -activity "Pinging servers . . ." -status "Pinged: $i of $($PCs.Count)" -percentComplete (($i / $PCs.Count) * 100)
}
#Announce WMI portion of script, clear host to get rid of status bar
Clear-Host
Write-Host
Write-Host
Write-Host
Write-Host "Beginning WMI scans. Please wait..."
Write-Host
Write-Host
Write-Host
$livePCs = Get-Content C:\script\livepcs.txt
#Begin foreach loop to query each live machine using WMI.
$i = 0
foreach($livePC in $livePCs)
{
$entry = Get-WmiObject win32_product -computername $livePC -Filter "Name LIKE '%db2%'"
# do the work
if ($entry -ne $null)
{
$livePc,$entry | out-file c:\script\db2pcs.txt -Encoding ASCII -Width 50 -Append
Write-Host "$livePC has DB2 installed"
}
else
{
write-host "$livePC does not have DB2 installed"
}
# update counter and write progress
$i++
Write-Progress -activity "Scanning WMI . . ." -status "Scanned: $i of $($livePCs.Count)" -percentComplete (($i / $livePCs.Count) * 100)
}
在最后一个循环中,您需要在每次WMI查询后增加计数器,然后使用更新后的值调用
Write Progress
已清理并正确格式化:
$i = 0
foreach($livePC in $livePCs)
{
$entry = Get-WmiObject win32_product -computername $livePC -Filter "Name LIKE '%db2%'"
# do the work
if ($entry -ne $null)
{
$livePc,$entry | out-file c:\script\db2pcs.txt -Encoding ASCII -Width 50 -Append
Write-Host "$livePC has DB2 installed"
}
else
{
write-host "$livePC does not have DB2 installed"
}
# update counter and write progress
$i++
Write-Progress -activity "Scanning WMI . . ." -status "Scanned: $i of $($livePCs.Count)" -percentComplete (($i / $livePCs.Count) * 100)
}
您没有在示例代码中的任何位置定义变量
$i
,您不必执行$($livePCs)
<代码>$livePCs将suffice@latkin,谢谢,那很有帮助。但进度条不会移动。它只是停留在起点附近,再也不会移动得更远。还有其他建议吗?您需要在每次查询WMI时增加$i
,然后再次调用写入进度
。请更新您的代码以显示您所做的更改。@latkin,好的,代码已更新!在WMI调用完成后,如何正确地增加$I变量?我为好奇的人发布了我的最终代码(为了人类的利益)。我继续为脚本的测试连接部分添加了另一个写进度例程,因为我最终需要查询几百台电脑。无论如何,再次感谢您的帮助!