2013-08-02 26 views
5

1.ps1 có 2 đối tượng được tạo và in. Nhưng chỉ có một hiển thị trong đầu ra. Cả hai đối tượng xuất hiện trong các trường hợp sau:
(1) viết-đầu ra được thực hiện với Format-List
(2) object1 có hơn 4 tài sản (và do đó nó được theo chiều dọc được định dạng tự động)
Đang cố gắng để hiểu được lý luận đằng sau hành vi này.Thiếu thông tin ghi-xuất PowerShell - chỉ in đối tượng thứ nhất

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

Bạn muốn xem điều gì? –

+0

@StanleyDeBoer Đối tượng thứ hai, hiển nhiên. –

+0

Tôi nhận được rằng, nó chỉ là không rõ ràng với tôi để mong đợi các cột trong 'Định dạng-Bảng' để thay đổi. –

Trả lời

2

Nếu bạn chỉ đang cố gắng hiển thị thông tin, bạn nên sử dụng Write-Host thay vì Write-Output. Bạn muốn sử dụng Write-Output khi bạn đang gửi dữ liệu trong kênh và không nên được sử dụng để chỉ hiển thị dữ liệu.

Đây là một bài mà đưa ra một sâu sắc hơn câu trả lời: Which should I use: "Write-Host", "Write-Output", or "[console]::WriteLine"?

Từ liên kết:

Write-Output nên được sử dụng khi bạn muốn gửi dữ liệu trên trong đường ống, nhưng không nhất thiết muốn hiển thị nó trên màn hình. Các đường ống cuối cùng sẽ ghi nó ra mặc định nếu không có gì khác sử dụng nó đầu tiên. Viết-Host nên được sử dụng khi bạn muốn làm ngược lại. [console] :: WriteLine cơ bản là những gì Write-Host đang làm phía sau hậu trường.

+0

có, điều đó giải thích hành vi. Vâng, trường hợp sử dụng thực tế mà tôi gặp phải tình huống này - chúng tôi thực sự cần nó pipelined, do đó, lệnh ghép ngắn khác có thể sử dụng prop/giá trị của đối tượng truyền xuống đường ống. Theo ý kiến ​​của tôi, định dạng đầu ra trong máy chủ ghi không phải là một cách trực quan từ quan điểm của khách hàng. – v2b

+0

Bạn vẫn có thể định dạng 'Write-Host' để làm cho nó dễ nhìn hơn :) – BlackHatSamurai

2

Tôi không thể giải thích hành vi này, nhưng bạn có thể giảm thiểu nó bằng cách sử dụng một định dạng rõ ràng cho sản lượng đầu tiên, ví dụ:

Write-Output $object1 | Format-Table 

Dường như không có định dạng rõ ràng PowerShell nhớ một ứng dụng ngầm định dạng bảng và bỏ qua đầu ra không khớp với định dạng này. Ví dụ, nếu bạn thêm một Write-Output $object1 ở phần cuối của kịch bản:

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

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

bạn sẽ nhận được kết quả này:

PS C:\> .\test.ps1 

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

pv1         pv2         pv3

Wat?! O_o ​​

Tại sao mọi người sẽ coi đây là một ý tưởng tốt là ngoài tôi.

+0

có, như tôi đã đề cập trong câu hỏi ban đầu của tôi, danh sách định dạng hoạt động. Chỉ muốn hiểu lý do tại sao viết cho giao diện điều khiển là rất khó mà không có nó. Nếu các tên prop giống nhau không được tìm thấy trong đối tượng tiếp theo, thì tại sao chúng không in các thuộc tính, giá trị của đối tượng thứ hai? – v2b

+0

Có lẽ vì nó có một bộ thuộc tính khác với đối tượng đầu tiên. Nếu bạn tạo một đối tượng khác với cùng một tập hợp thuộc tính như '$ object1' (tức là cùng tên, nhưng giá trị khác nhau), nó sẽ được hiển thị tốt. –

+0

Điều đó có biện minh cho việc bỏ qua đối tượng hoàn toàn không? Lý tưởng nhất là tôi đã có thể mong đợi ob1 của prop/val in .. theo sau là obj2 của prop/val .. và không cố gắng và câu lạc bộ obj2 với tài sản của obj1. Bởi vì chúng không khớp - vì vậy nó là một đối tượng khác. – v2b

2

Tôi nghĩ rằng nó phải làm theo cách Format-Table hoạt động. Tôi nghĩ theo mặc định PowerShell sẽ chọn Format-Table hoặc Format-List để hiển thị các đối tượng trên bảng điều khiển, tôi không chắc chắn quyết định được đưa ra như thế nào nhưng rõ ràng là Format-Table đã được chọn.

Format-Table hoạt động bằng cách lấy đối tượng đầu tiên và chọn thuộc tính từ đó. Đối với bất kỳ đối tượng nào theo sau đối tượng đầu tiên, nó sẽ chỉ cư các cột cho thuộc tính từ đối tượng đầu tiên.

Bạn có thể muốn thử

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

Và xem nếu mà có được là bạn biết những gì bạn đang tìm kiếm.

+0

<5 thuộc tính, nó sử dụng Định dạng-Bảng. Đối với> 5 Định dạng-Danh sách được sử dụng. Nhưng tôi tự hỏi, tại sao họ sẽ câm như vậy để không tìm ra rằng đầu ra và thứ hai ghi-đầu ra có thuộc tính khác nhau-tên - vì vậy họ có thể/là đối tượng của các loại khác nhau. – v2b

+0

Bởi vì hầu hết các lệnh xuất các đối tượng đầu ra của một kiểu tại một thời điểm (tôi không thể nghĩ ra bất kỳ lệnh dựng sẵn nào xuất ra nhiều loại đối tượng cùng một lúc), Vì vậy, bạn đang nói về một trường hợp cạnh. Các trường hợp cạnh thường được xử lý khác nhau sau đó bạn có thể mong đợi đơn giản chỉ vì hành vi đúng trong một tình huống có thể là hành vi sai trong một trường hợp khác. –

+0

ah !! - có thể họ không trộn định dạng khi chạy từ tập lệnh. Vì vậy, ở đây, đối tượng 1 sẽ là Định dạng-Bảng theo mặc định (<5 đạo cụ), nhưng object2 phải là Định dạng-Danh sách (> 5 đạo cụ). Nếu cmdlet được chạy trên shell, nó là Format-Table cho 1, và Format-List cho 2. Tôi mong đợi cùng một hành vi trong khi chạy nó từ một script quá – v2b