所以我是Powershell的新手,因为我想我错过了一些简单的东西。
我正在尝试显示一个进度条,显示下面列出的脚本将显示所有带有x,y,z属性的 ActiveDirectory 计算机的时间。
我知道要获得一个进度条,你需要一个循环,但我不确定我是否真的实现了这一点。当我执行命令
时似乎没有发生任何事情$computerList = Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem
foreach ($computer in $computerList) {
Write-Progress -Activity 'Processing computers' -CurrentOperation $computer
Start-Sleep -Milliseconds 200
}
答案 0 :(得分:3)
除了缺少其他人指出的PercentComplete参数外,第一行将在foreach
循环开始之前完成。因此,Write-Progress
即将开始显示sleep
的时间长度。不是从第一行显示这些属性所需的时间。
如果您的计划是使用该数据代替Sleep
,那么这将是有意义的。否则,在开始跟踪进度之前,处理已完成。
如果你想知道该命令后来需要多长时间,那么你想使用Measure-Command
Measure-Command {Get-ADComputer -filter * -Property * | select Name,OperatingSystem}
如果您想在管道执行时跟踪该命令的进度,那么您将遇到几个问题。首先,服务器不会告诉你它有多少个对象。但是说你之前运行它并且知道返回了多少个对象,你可以这样做:
$i = 0
Get-ADComputer -filter * -Property * |
% {
$i++
Write-Progress -Activity 'Processing computers' -PercentComplete ($i/$PreviousCount*100)
} |
Select-Object Name,OperatingSystem
第二个这样做会增加很多开销,使你的命令花费更长的时间。
另一个建议是,因为您使用Select-Object
过滤掉所有内容并关心操作需要多长时间,所以只请求这两个属性。
$computerList = Get-ADComputer -Filter * -Property Name,OperatingSystem | Select-Object Name,OperatingSystem
答案 1 :(得分:2)
您需要-PercentComplete $Progress
来显示进度!
以下是您的示例的实现:
$computerList = Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem
$i=0
foreach ($computer in $computerList) {
$Progress = $i/$computerList.count*100
Write-Progress -Activity 'Processing computers' -CurrentOperation $computer -PercentComplete $Progress
Start-Sleep -Milliseconds 200;$i++
}