$res = Invoke-Sqlcmd -Query "select * from customer" -ServerInstance "(localdb)\MSSQLLocalDB" -Database "Database1" -OutputAs DataTables
$res | Where-Object FirstName -eq "John"
$res.Where({$_.FirstName -eq "John"})
這是輸出:
Id FirstName City
-- --------- ----
1 John Augusta
1 John Augusta
我期待這個:
Id FirstName City
-- --------- ----
1 John Augusta
Id FirstName City
-- --------- ----
1 John Augusta
uj5u.com熱心網友回復:
基于有用的評論:
行為是設計使然:
給定腳本或單個互動提交的命令列輸出的物件都被發送到單個管道的成功輸出流。
當管道的輸出既未被捕獲也未被重定向時,PowerShell 將for-display 輸出格式應用于給定管道的成功輸出流中的所有輸出物件,如果第一個輸出物件隱式選擇表格格式,則相同型別的所有后續物件被格式化為列印到主機(顯示幕、終端)的同一個表的一部分。
- 如果后續物件屬于不同型別以及它們也是
[pscustomobject]實體,但具有不同的屬性集,事情就會變得棘手 - 請參閱此答案以獲取更多資訊。
- 如果后續物件屬于不同型別以及它們也是
如果你想單獨格式化給定命令的輸出,你有三個基本選項,如果你還想選擇以后以編程方式處理輸出,而不僅僅是格式化顯示,所有這些都是次優的:
使用以下命令將輸出直接發送到主機
Out-Host:$res | Where-Object FirstName -eq "John" | Out-Host- 這繞過了成功輸出流,這意味著無法捕獲或重定向此輸出。
使用
Format-*cmdlet,例如顯式:Format-Table$res | Where-Object FirstName -eq "John" | Format-Table- 這會將表示格式化指令的物件而不是原始物件發送到成功輸出流,主機(作為默認輸出目標)正確呈現該輸出流,但這些物件對于進一步的編程處理毫無意義。
使用
Out-String(可能在呼叫Format-*cmdlet 之前選擇格式型別和/或控制格式的細節):$res | Where-Object FirstName -eq "John" | Out-String- 這會將單個多行字串發送到成功輸出流,其中包含您在主機中使用
Out-Host[1]看到的相同表示,并且由于字串始終按原樣呈現,因此您將看到相同的主機輸出;在程式化處理中,這些字串比 cmdlet 輸出的格式化指令物件相對更有意義Format-*,但與原始輸出物件相比,仍然相當于丟失了資訊。
- 這會將單個多行字串發送到成功輸出流,其中包含您在主機中使用
[1] 不幸的是,Out-String總是在這個表示后面附加一個尾隨換行符;這種有問題的行為是GitHub 問題 #14444的主題。正如zett42指出的那樣, usingOut-String -Stream避免了這個問題,盡管以將多行字串表示的行單獨發送到輸出流為代價;為避免這種情況,您可以使用(... | Out-String -Stream) -join "`n"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490719.html
標籤:电源外壳
