使用get-adcomputer时的Powershell进度条

时间:2017-03-07 21:12:02

标签: powershell

所以我是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
}

2 个答案:

答案 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++
}