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

}

この例では「Openingreport....」が生成されますが、ループが終了することはありません。

おそらくコールバックまたはデリゲートを使用する必要がありますが、この状況でのパターンはわかりません。

私は何が欠けていますか?

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 条件は常に true になります。関数は、何かが壊れるまで永遠に続きます (これはスクリプトでは決して起こりません。

まず、関数でそれを行い、次の行に進みます:

# 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 に答える