2013-08-02 26 views
5

1.ps1'in 2 nesnesi vardır ve yazdırılır. Ama çıktıda sadece bir tane var. Hem nesneler aşağıdaki durumlarda ortaya:
(1) yazma-çıkış Formatı-List
(2) 4'ten fazla özelliklere sahiptir (ve bu nedenle dikey otomatik olarak biçimlendirilir alır) object1
ile yapılır anlamaya çalışıyorum bu davranışın arkasındaki mantık.PowerShell yazma-eksik bilgi eksik - sadece yazdırır 1. nesne

PS C:\> cat .\1.ps1 
$object1 = New-Object PSObject 
$object1 | add-member NoteProperty -name pn1 -value pv1 
$object1 | add-member NoteProperty -name pn2 -value pv2 
$object1 | add-member NoteProperty -name pn3 -value pv3 
write-output $object1 

$object2 = New-Object PSObject 
$object2 | add-member NoteProperty -name npn1 -value npv1 
$object2 | add-member NoteProperty -name npn2 -value npv2 
$object2 | add-member NoteProperty -name npn3 -value npv3 
$object2 | add-member NoteProperty -name npn4 -value npv4 
$object2 | add-member NoteProperty -name npn5 -value npv5 
$object2 | add-member NoteProperty -name npn6 -value npv6 
write-output $object2 
PS C:\> 
PS C:\> .\1.ps1 

pn1          pn2          pn3 
---          ---          --- 
pv1          pv2          pv3 


PS C:\> 
+0

Neyi görmek istiyorsunuz? –

+0

@StanleyDeBoer Açıkçası ikinci nesne. –

+0

Bunu elde ettim, 'Format-Table' içindeki sütunların değişmesini beklemek benim için belli değil. –

cevap

2

Yalnızca bilgileri görüntülemeye çalışıyorsanız, Write-Output yerine Write-Host kullanıyor olmalısınız. Boru hattında veri gönderiyorken Write-Output'u kullanmak ve sadece verileri görüntülemek için kullanılmamalıdır. , Sen boru hattında verileri göndermek istediğinizde

Yaz-Çıktı kullanılmalıdır: bağlantısından Which should I use: "Write-Host", "Write-Output", or "[console]::WriteLine"?

:

Burada daha derinlemesine cevap veren bir yazıdır ancak mutlaka ekranda görüntülemek istemiyorum. İlk önce hiçbir şey kullanmazsa, boru hattı en sonunda varsayılan olarak yazacaktır. Aksini yapmak istediğinizde Write-Host kullanılmalıdır. [konsol] :: WriteLine, esas olarak Write-Host'un sahne arkasında yaptığı şeydir.

+0

konsoluna yazıyor. Aslında, bu durumla karşılaştığım gerçek kullanım durumu - aslında boru hattına ihtiyacımız var, böylece diğer cmdlet'ler boru hattından geçen nesnenin prop/değerlerini kullanabilir. Benim düşünceme göre, yazma-host'taki çıktı formatlama, müşteri perspektifinden görsel olarak hoşnut değil. – v2b

+0

Daha fazla görsel olarak hoşlanmak için 'Yazma-Host'unu biçimlendirebilirsiniz :) – BlackHatSamurai

2

Ben bu davranışı açıklayamam, ama örneğin ilk çıkışı için açık bir biçimlendirici kullanarak bunu azaltabilir: açık biçimlendirme olmadan PowerShell bir örtük uygulanan hatırlar gibi

Write-Output $object1 | Format-Table 

görünüyor Tablo formatı ve bu formatla eşleşmeyen çıktılar.

$object1 = New-Object PSObject 
... 
write-output $object1 

$object2 = New-Object PSObject 
... 
write-output $object2 
write-output $object1

bu çıktıyı alırsınız: Örneğin, komut dosyası, sonunda başka Write-Output $object1 eklerseniz

PS C:\> .\test.ps1 

pn1         pn2         pn3 
---         ---         --- 
pv1         pv2         pv3 

pv1         pv2         pv3

Wat?!

O_o ​​Neden kimse bunun iyi bir fikir olduğunu dikkate alacağını Benim dışımda.

+0

Evet, orijinal sorumda belirtmiş olduğum gibi, biçimlendirme listesi çalışır. Sadece konsola yazmanın neden bu kadar zor olduğunu anlamak istedim. Bir sonraki nesnede aynı prop adları bulunmuyorsa, neden ikinci nesnenin özelliklerini, değerlerini de yazdırmıyorlardı? – v2b

+0

Muhtemelen ilk nesneden farklı bir özellikler kümesine sahip olduğu için. Eğer $ object1' ile aynı özellik kümesine sahip başka bir nesne oluşturursanız (yani aynı isimler, ancak farklı değerler), sadece iyi gösterilecektir. –

+0

Bu, nesneyi tamamen atlamayı haklı çıkarır mı? İdeal olarak, ob1'in prop/val basımını beklerdim .. ardından obj2's prop/val .. ve object obj2 ile obj1'in özelliklerini denemezdi. Çünkü sadece eşleşmiyorlar - bu yüzden farklı bir nesne. – v2b

2

Format-Table çalışma biçimiyle ilgili olması gerektiğini düşünüyorum. Bence PowerShell, konsoldaki nesneleri görüntülemek için Format-Table veya Format-List'u seçecek, kararın nasıl alınacağından emin değilim ama belli ki Format-Table seçildi. İlk nesneyi alarak ve bu özelliklerden birini seçerek,

Format-Table. İlkini takip eden herhangi bir nesne için, yalnızca ilk nesneden özelliklerin sütunlarını dolduracaktır.

Sen

.\1.ps1 | % { $_ | ft } 

denemek Ve bu Aradığınız ne var olsun olmadığını görmek isteyebilirsiniz.

+0

<5 özellik, Format-Tablosu kullanır. > 5 Biçim Listesi için kullanılır. Ama merak ediyorum, neden birinci ve ikinci yazma-çıktısının farklı mülk isimleri olduğunu anlayamayacak kadar aptal olmaları gerekir - böylece farklı türden nesneler olabilirler. – v2b

+0

Çoğu zaman tek bir seferde bir nesnenin çıktı nesnelerini komutladığından (bir kerede birden fazla nesne türünü üreten yerleşik komutları düşünemiyorum), bir kenar durumundan bahsediyorsunuz. Kenar vakaları genellikle farklı şekilde ele alınır, çünkü bir durumda doğru davranış bir başkasında yanlış davranış olabileceğinden bekleyebilirsiniz. –

+0

ah !! - Bir komut dosyasından çalışırken biçimlendirmeyi karıştırmazlar. Burada, nesne 1 varsayılan olarak Format-Tablo olacaktır (<5 sahne), ancak object2 Format-List (> 5 sahne) olmalıdır. Cmdlet'ler kabukta çalıştırılırsa, 1 için Format-Tablo ve 2 için Format-List'dür. Aynı davranışı bir betikden çalıştırırken beklerim de – v2b