考慮以下函式:
function myFunction {
100
sleep 1
200
sleep 1
300
sleep 1
}
正如您所看到的,它將在管道中一一發出這些值。
但我想在繼續之前等待所有值都被發出。喜歡
myFunction | waitForThePreviousCommandToComplete | Format-Table
我希望上面的 Format-Table 接收整個陣列,而不是一個接一個的專案。
在Powershell中甚至可能嗎?
uj5u.com熱心網友回復:
使用
(...),分組運算子,以便首先完整收集命令的輸出,然后將其發送到成功輸出流(管道)。
# Due to (...), doesn't send myfunction's output to Format-Table until it has run
# to completion and all its output has been collected.
(myFunction) | Format-Table
# Also works for entire pipelines.
(100, 200, 300 | ForEach-Object { $_; Start-Sleep 1 }) | Format-Table
筆記:
如果您需要預先收集多個命令(管道)和/或語言陳述句的輸出,請改用
$(...)子運算式運算子,例如$(Get-Date -Year 2020; Get-Date -Year 2030) | Format-Table; 下一點也適用于它。列舉收集的任何輸出,即,如果收集的輸出
(...)是可列舉的,則其元素將一一發送到成功輸出流 - 盡管此時沒有任何延遲。- 請注意,如果收集了兩個或多個輸出物件,則收集的輸出始終是可列舉的(型別為 的陣列
[object[]]),但在通常情況下,收集的單個物件本身就是可列舉的,它也可以是一個。 - 例如,
(Write-Output -NoEnumerate 1, 2, 3) | Measure-Object報告計數3,即使Write-Output -NoEnumerate將給定陣列作為單個物件輸出(沒有(...),Measure-Object將報告1)。
- 請注意,如果收集了兩個或多個輸出物件,則收集的輸出始終是可列舉的(型別為 的陣列
通常,命令(cmdlet、函式、腳本)流式傳輸它們的輸出物件,即將它們一一發送到管道,一旦它們產生,而命令仍在運行,就像你的函式一樣,并且還作用于它們的管道一一輸入。但是,某些 cmdlet總是先收集所有輸入物件,然后再開始發出其輸出物件,這在概念上是必要的:值得注意的例子是
Sort-Object、Group-Object和,所有這些都必須在它們開始之前對它們的全部Measure-Object輸入起作用發出結果。當它通過開關時同上,接下來討論。Format-Table-AutoSize具體來說
Format-Table,您可以使用-AutoSize開關強制它首先收集所有輸入,以便根據所有資料確定合適的顯示列寬(默認情況下,Format-Table等待 300 毫秒。為了確定列寬,基于那時它收到的輸入資料的任何子集)。但是,這不適用于所謂的帶外格式化物件,尤其是字串和原始.NET 型別,
.ToString()它們在接收時仍會發出(通過它們的文化不變表示)。僅首先收集復雜物件(具有屬性的物件),尤其是哈希表和
[pscustomobject]實體;例如:# Because this ForEach-Object call outputs complex objects (hashtables), # Format-Table, due to -AutoSize, collects them all first, # before producing its formatted output. 100, 200, 300 | ForEach-Object { @{ num = $_ }; Start-Sleep 1 } | Format-Table -AutoSize
如果您想創建一個預先收集其所有管道輸入的自定義函式,您有兩種選擇:
創建一個在其函式體中使用自動變數的簡單函式,該函式僅在收到所有輸入后隱式運行;例如:
$input# This simple function simply relays its input, but # implicitly only after all of it has been collected. function waitForThePreviousCommandToComplete { $input } # Output doesn't appear until after the ForEach-Object # call has emitted all its output. 100, 200, 300 | ForEach-Object { $_; Start-Sleep 1 } | waitForThePreviousCommandToComplete在高級函式的背景關系中,您必須通過在塊中分配的串列型別實體在塊中迭代地手動收集所有輸入,然后您可以在塊中對其進行處理。
processbeginend- 雖然使用一個簡單的函式
$input顯然更簡單,但您可能仍然想要一個高級函式,因為它提供了所有額外的好處(防止未系結的引數、引數驗證、多個管道系結引數......)。 - 有關示例,請參見此答案。
- 雖然使用一個簡單的函式
uj5u.com熱心網友回復:
排序等到它擁有一切。
myFunction | sort-object
或者:
(myFunction)
$(myfunction1; myFunction2)
myFunction | format-table -autosize
myFunction | more
另請參閱: 如何告訴 PowerShell 在開始下一個命令之前等待每個命令結束?
uj5u.com熱心網友回復:
由于某些未知原因,只需將函式放在括號內就解決了我的問題:
(myFunction) | Format-Table
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517252.html
標籤:电源外壳
