2009-10-28 5 views
49

uruchomić poniższy kod za pomocą PowerShell uzyskać listę dodaj/usuń programy z rejestru:Jak dodać nowy wiersz do danych wyjściowych polecenia w PowerShell?

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

Chcę lista być oddzielone znakami nowej linii na każdym programie. Próbowałem:

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 } 

Ale wynik w formatowaniu dziwne, gdy wyjście do konsoli, a z trzech znaków kwadratowych po każdym wierszu, gdy wyjście do pliku. Próbowałem Format-List, Format-Table i Format-Wide bez powodzenia. Początkowo myślałem, że coś takiego zadziała:

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

Ale to tylko dało mi błąd.

Odpowiedz

65

Albo po prostu ustawić separator pól wyjście do podwójnego nowej linii, a następnie upewnij się, że ciąg po wysłaniu go do pliku:

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

Uważaj, aby użyć opcji `i nie '. Na mojej klawiaturze (układ angielsko-angielski Qwerty) znajduje się on po lewej stronie 1. (Przeniesiono tutaj z komentarzy - Dzięki Koen Zomers)

+1

To faktycznie zadziałało. Ale jeśli dodane zostaną jakiekolwiek inne wartości, tj. $ _. GetValue ("InstallDate"), to zaczyna działać. Spełnia jednak oryginalne pytanie, więc dzięki za pomoc. – mike

+0

Dodałem alternatywną odpowiedź poniżej, która moim zdaniem jest prawdopodobnie lepsza :) – Jaykul

+7

Działa świetnie. Uważaj, aby użyć "i nie". Na mojej klawiaturze (układ angielsko-angielski Qwerty) znajduje się na lewo od 1. –

64

spróbuj tego:

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 

To daje następujący tekst w moim pliku addrem.txt:

Adobe AIR 

Adobe Flash Player 10 ActiveX 

... 

Uwaga: w moim systemie GetValue ("DisplayName") zwraca wartość null niektóre wpisy, więc je odfiltrowuję. BTW, byłaś blisko z tym:

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

wyjątkiem, że w ciągu, jeśli chcesz uzyskać dostęp do właściwości zmiennej, czyli „oceny wyrażenie”, a następnie trzeba użyć składni podwyrażenie jak tak :

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

zasadzie w podwójnym cudzysłowie PowerShell poszerzy zmienne jak $_, ale nie oceni wyrażeń chyba umieścić wyraz w podwyrażenie używając następującej składni:

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

Wypróbowałem obie powyższe sugestie, a formatowanie nadal nie jest w 100%. Każdy znak nowej linii pojawia się jako mały kwadrat (może być Unicode?) W Notatniku. W Wordpad wszystko wydaje się w porządku, ale Word narzeka na kodowanie. Korzystanie z Foreach {"$ ($ _. GetValue (" DisplayName "))' n "} nadal wyświetla błędny format w dowolnym pliku. – mike

+0

Domyślnym wyjściem dla Powershell jest kod Unicode. Zmodyfikuję przykład, aby pokazać, jak zapisać w formacie ASCII. –

+0

Próbowałem każdej opcji kodowania out-file i żaden z nich nie dał mi odpowiednich wyników. Sprawdziłem zmienną środowiskową $ OutputEncoding i wszystko wyszło w US-ASCII. Myślę, że spróbuję innego podejścia, może w pytonie. – mike

4

Myślę, że miałeś prawidłowy pomysł ze swoim ostatnim przykładem. Wystąpił tylko błąd, ponieważ próbujesz wstawić cudzysłowy do już cytowanego ciągu znaków. Naprawi to:

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

Edycja: Keith's $() operator faktycznie tworzy lepszą składnię (zawsze o tym zapominam). Można też uciec cytaty wewnątrz cytuje jako tak:

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

To jest poprawna odpowiedź na pytanie. To powinna być zaakceptowana odpowiedź. –

6

Ostatecznie, co próbujesz zrobić z pustymi liniami EXTRA między nimi jest trochę mylące :)

Myślę, że to, co naprawdę chcesz zrobić, to użyć Get-ItemProperty. Gdy brakuje wartości, dostaniesz błędy, ale możesz je zlikwidować za pomocą -ErrorAction 0 lub zostawić je jako przypomnienia.Ponieważ dostawca rejestru zwraca dodatkowe właściwości, należy pozostawić wartość Select-Object, która ma takie same właściwości, jak właściwości Get.

Następnie, jeśli chcesz, aby każda właściwość w linii z pustą linią między, użyj Format-List (w przeciwnym razie, użyj Format-Table, aby uzyskać jeden na linii).

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

Tak! Powinienem był to zrobić od początku, zamiast bawić się nowymi liniami. Dzięki za pomoc! Naprawdę to doceniam. – mike

+0

@mike, powinieneś ustawić to jako odpowiedź, prawda? – Jaykul

4

Opcja, że ​​mają tendencję do używania, głównie dlatego, że jest prosty i nie muszę myśleć, używa Write-Output jak poniżej. Write-Output wstawi dla ciebie znacznik EOL i możesz po prostu wypisać gotowy ciąg znaków.

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

Alternatywnie, można również po prostu zbudować cały ciąg używając Write-Output, a następnie wcisnąć gotowego ciąg na Out-File.