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变量?我为好奇的人发布了我的最终代码(为了人类的利益)。我继续为脚本的测试连接部分添加了另一个写进度例程,因为我最终需要查询几百台电脑。无论如何,再次感谢您的帮助!