2009-10-28 36 views
49

tôi chạy đoạn mã sau sử dụng PowerShell để có được một danh sách Add/Remove Programs từ registry:Làm cách nào để thêm dòng mới vào đầu ra lệnh trong PowerShell?

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") } ` 
    | Out-File addrem.txt 

Tôi muốn danh sách để được ngăn cách bởi dòng mới cho mỗi chương trình. Tôi đã thử:

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { Write-Output $_.GetValue("DisplayName") `n } ` 
    | out-file test.txt 

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object {$_.GetValue("DisplayName") } ` 
    | Write-Host -Separator `n 

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { $_.GetValue("DisplayName") } ` 
    | foreach($_) { echo $_ `n } 

Nhưng tất cả dẫn đến định dạng lạ khi xuất ra bàn điều khiển và với ba ký tự vuông sau mỗi dòng khi xuất ra tệp. Tôi đã thử Format-List, Format-TableFormat-Wide mà không có may mắn. Ban đầu, tôi nghĩ một cái gì đó như thế này sẽ hoạt động:

Get-ChildItem -path hklm:\software\microsoft\windows\currentversion\uninstall ` 
    | ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

Nhưng điều đó đã cho tôi một lỗi.

Trả lời

65

Hoặc, chỉ cần đặt tách lĩnh vực đầu ra để newlines đôi, và sau đó chắc chắn bạn sẽ có được một chuỗi khi bạn gửi nó cho file:

$OFS = "`r`n`r`n" 
"$(gci -path hklm:\software\microsoft\windows\currentversion\uninstall | 
    ForEach-Object -Process { write-output $_.GetValue('DisplayName') })" | 
out-file addrem.txt 

Cẩn thận khi sử dụng `và không phải '. Trên bàn phím của tôi (bố trí Qwerty tiếng Anh-Mỹ) nó nằm bên trái của 1. (Đã di chuyển ở đây từ các ý kiến ​​- Cảm ơn Koen Zomers)

+1

Điều này thực sự hiệu quả. Tuy nhiên, nếu có bất kỳ giá trị nào khác được thêm vào, tức là $ _. GetValue ('InstallDate'), sau đó nó lộn xộn. Nó đáp ứng các câu hỏi ban đầu mặc dù cảm ơn vì sự giúp đỡ. – mike

+0

Tôi đã thêm một câu trả lời thay thế bên dưới mà tôi cho là có thể tốt hơn :) – Jaykul

+7

Hoạt động tuyệt vời. Cẩn thận khi sử dụng 'và không phải '. Trên bàn phím của tôi (bố cục Qwerty bằng tiếng Anh-Mỹ) nằm ở bên trái của 1. –

64

này cung cấp cho một thử:

PS> $nl = [Environment]::NewLine 
PS> gci hklm:\software\microsoft\windows\currentversion\uninstall | 
     ForEach { $_.GetValue("DisplayName") } | Where {$_} | Sort | 
     Foreach {"$_$nl"} | Out-File addrem.txt -Enc ascii 

Nó mang lại các văn bản sau đây trong tập tin addrem.txt tôi:

Adobe AIR 

Adobe Flash Player 10 ActiveX 

... 

Lưu ý: trên hệ thống của tôi, GetValue ("DisplayName") trả về null cho một số mục, vì vậy tôi lọc chúng ra. BTW, bạn đang ở rất gần với điều này:

ForEach-Object -Process { "$_.GetValue("DisplayName") `n" } 

Trừ rằng trong vòng một chuỗi, nếu bạn cần phải truy cập vào một tài sản của một biến, có nghĩa là, "đánh giá một biểu thức", sau đó bạn cần phải sử dụng cú pháp subexpression như vậy :

Foreach-Object -Process { "$($_.GetValue('DisplayName'))`r`n" } 

về cơ bản trong một chuỗi trích dẫn đôi PowerShell sẽ mở rộng biến như $_, nhưng nó sẽ không đánh giá biểu thức trừ bạn đặt các biểu hiện trong một subexpression sử dụng cú pháp sau:

$(`<Multiple statements can go in here`>). 
+0

Tôi đã thử cả hai đề xuất ở trên và định dạng vẫn không phải là 100%. Mỗi dòng mới hiển thị dưới dạng hình vuông nhỏ (unicode có thể?) Trong Notepad. Trong Wordpad mọi thứ có vẻ tốt, nhưng Word phàn nàn về mã hóa. Sử dụng Foreach {"$ ($ _. GetValue ('DisplayName'))' n "} vẫn xuất ra định dạng sai trong bất kỳ tệp nào. – mike

+0

Đầu ra mặc định cho Powershell là Unicode. Tôi sẽ sửa đổi ví dụ để hiển thị cách lưu dưới định dạng ascii. –

+0

Tôi đã thử mọi tùy chọn mã hóa cho tệp ngoài và không có tùy chọn nào cho tôi kết quả phù hợp. Tôi đã kiểm tra biến môi trường $ OutputEncoding và mọi thứ đã đưa ra US-ASCII. Tôi nghĩ rằng tôi sẽ thử một cách tiếp cận khác, có thể trong python. – mike

4

Tôi nghĩ bạn đã có ý tưởng chính xác với ví dụ cuối cùng của mình. Bạn chỉ gặp lỗi vì bạn đang cố gắng đặt dấu ngoặc kép bên trong một chuỗi đã được trích dẫn. Điều này sẽ khắc phục sự cố:

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output ($_.GetValue("DisplayName") + "`n") } 

Chỉnh sửa: Toán tử Keith's $() thực sự tạo cú pháp tốt hơn (tôi luôn quên cú pháp này). Bạn cũng có thể thoát khỏi dấu ngoặc kép bên trong dấu ngoặc kép như vậy:

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object -Process { write-output "$($_.GetValue(`"DisplayName`"))`n" } 
+1

Đây là câu trả lời đúng cho câu hỏi. Đây phải là câu trả lời được chấp nhận. –

6

Cuối cùng, những gì bạn đang cố gắng làm với các dòng trống EXTRA giữa mỗi cái là một chút bối rối :)

Tôi nghĩ điều bạn thực sự muốn làm là sử dụng Get-ItemProperty. Bạn sẽ nhận được lỗi khi giá trị bị thiếu, nhưng bạn có thể chặn chúng bằng -ErrorAction 0 hoặc chỉ để lại chúng dưới dạng lời nhắc.Vì nhà cung cấp đăng ký trả về các thuộc tính bổ sung, bạn sẽ muốn gắn vào một số Select-Object sử dụng các thuộc tính giống như Thuộc tính Get.

Sau đó, nếu bạn muốn mỗi thuộc tính trên một dòng có một dòng trống giữa, hãy sử dụng Format-List (nếu không, hãy sử dụng Format-Table để nhận một dòng trên mỗi dòng).

gci -path hklm:\software\microsoft\windows\currentversion\uninstall | 
gp -Name DisplayName, InstallDate | 
select DisplayName, InstallDate | 
fl | out-file addrem.txt 
+0

Có! Tôi nên làm nó theo cách này ngay từ đầu, thay vì làm rối tung những dòng mới. Cảm ơn đã giúp đỡ! Thực sự đánh giá cao nó. – mike

+0

@mike, bạn nên đặt câu trả lời này là câu trả lời đúng không? – Jaykul

4

Tùy chọn mà tôi có xu hướng sử dụng, chủ yếu là vì nó đơn giản và tôi không phải nghĩ, đang sử dụng Write-Output như bên dưới. Viết-Đầu ra sẽ đặt một điểm đánh dấu EOL trong chuỗi cho bạn và bạn có thể chỉ cần xuất chuỗi đã hoàn thành.

Write-Output $stringThatNeedsEOLMarker | Out-File -FilePath PathToFile -Append 

Ngoài ra, bạn cũng có thể xây dựng toàn bộ chuỗi bằng cách sử dụng Viết-đầu ra và sau đó đẩy chuỗi đã hoàn thành vào Out-File.

Các vấn đề liên quan