0

我正在尝试创建一个简单的控制台计时器显示。

...

$rpt = $null
write-status "Opening report", $rpt

# long-running
$rpt = rpt-open -path "C:\Documents and Settings\foobar\Desktop\Calendar.rpt"

...

function write-status ($msg, $obj) {

    write-host "$msg" -nonewline

    do {
        sleep -seconds 1
        write-host "." -nonewline
        [System.Windows.Forms.Application]::DoEvents() 
    } while ($obj -eq $null)

    write-host

}

该示例生成“打开报告 ....”,但循环永远不会退出。

我可能应该使用回调或委托,但我不确定这种情况下的模式。

我错过了什么?

4

3 回答 3

2

您应该使用Write-Progress通知用户您的流程的运行状态并在事件需要时更新它。

于 2013-03-19T19:25:57.243 回答
1

如果您想使用 powershell 进行一些“并行”计算,请使用作业。

$job = Start-Job -ScriptBlock {Open-File $file} -ArgumentList $file
while($job.status -eq 'Running'){
    Write-Host '.' -NoNewLine
}

这是我对Write-Host 的看法。

于 2013-03-19T18:05:58.357 回答
0

脚本按顺序运行。当您输入一个$null对象时,while 条件将始终为真。该功能将永远持续下去,直到有东西破坏它(这在您的脚本中从未发生过。

首先,它将使用该功能完成并继续您的下一行:

# long-running
$rpt = rpt-open -path "C:\Documents and Settings\foobar\Desktop\Calendar.rpt"

摘要:您的 while 循环就像while($true)atm = bad design

于 2013-03-19T16:08:30.373 回答