2009-10-28 14 views
49

ho eseguito il seguente codice usando PowerShell per ottenere una lista di add/rimuovere i programmi dal Registro di sistema:Come si aggiunge una nuova riga all'output del comando in PowerShell?

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

voglio l'elenco per essere separata da ritorni a capo per ogni programma. Ho provato:

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 } 

Ma tutto risultato nella formattazione strano quando l'uscita per la console, e con tre caratteri quadrati dopo ogni riga quando output in un file. Ho provato Format-List, Format-Table e Format-Wide senza fortuna. Inizialmente, pensavo che qualcosa del genere avrebbe funzionato:

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

Ma questo mi ha dato solo un errore.

risposta

65

Oppure, semplicemente impostare il separatore di campo di uscita doppie a capo, e quindi assicuratevi di avere una stringa quando lo si invia al 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 

Attenzione a usare `e non il '. Sulla mia tastiera (layout Qwerty USA-Inglese) si trova a sinistra del 1. (spostato qui dai commenti - Grazie Koen Zomers)

+1

Questo ha funzionato davvero. Ma, se vengono aggiunti altri valori, ad esempio $ _. GetValue ('InstallDate'), allora si incasina. Risponde comunque alla domanda originale, quindi grazie per l'aiuto. – mike

+0

Ho aggiunto una risposta alternativa sotto la quale penso sia probabilmente meglio :) – Jaykul

+7

Funziona alla grande. Attenzione a usare 'e non il '. Sulla mia tastiera (layout Qwerty USA-Inglese) si trova a sinistra del 1. –

64

dare una prova:

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 

Produce il seguente testo nel mio file addrem.txt:

Adobe AIR 

Adobe Flash Player 10 ActiveX 

... 

Nota: sul mio sistema, GetValue ("DisplayName") restituisce null per alcune voci, quindi le filtrerò. A proposito, tu eri vicino con questo:

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

Solo che all'interno di una stringa, se avete bisogno di accedere a una proprietà di una variabile, cioè, "valutare un'espressione", allora avete bisogno di utilizzare la sintassi sottoespressione in questo modo :

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

In sostanza all'interno di una stringa doppia citato PowerShell si espanderà variabili come $_, ma non sarà valutare le espressioni a meno che non si mette l'espressione all'interno di una sottoespressione utilizzando questa sintassi:

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

Ho provato entrambi i suggerimenti sopra e la formattazione non è ancora al 100%. Ogni nuova riga appare come un quadratino (unicode forse?) Nel Blocco note. In Wordpad tutto sembra a posto, ma Word si lamenta della codifica. Utilizzo di Foreach {"$ ($ _. GetValue ('DisplayName'))' n "} restituisce comunque il formato errato in qualsiasi file. – mike

+0

L'output predefinito per PowerShell è Unicode. Modificheremo l'esempio per mostrare come salvare in formato ASCII. –

+0

Ho provato ogni opzione di codifica per i file esterni e nessuno di questi mi ha dato i risultati corretti. Ho controllato la variabile d'ambiente $ OutputEncoding e tutto è uscito US-ASCII. Penso che proverò un approccio diverso, forse in python. – mike

4

Penso che tu abbia avuto l'idea corretta con il tuo ultimo esempio. Hai ricevuto un errore solo perché stavi cercando di inserire virgolette all'interno di una stringa già quotata. Questo lo risolverà:

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

Edit: operatore di Keith $() in realtà crea una sintassi migliore (mi dimentico sempre su questo). Si può anche sfuggire citazioni tra virgolette come così:

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

Questa è la risposta corretta alla domanda. Questa dovrebbe essere la risposta accettata. –

6

In definitiva, quello che stai cercando di fare con le linee vuote EXTRA tra ognuna è un po 'di confusione :)

Penso che quello che vuoi veramente sia usare Get-ItemProperty. Riceverai errori quando mancano dei valori, ma puoi eliminarli con -ErrorAction 0 o semplicemente lasciarli come promemoria.Poiché il provider del Registro di sistema restituisce proprietà aggiuntive, ti consigliamo di inserire un valore Select-Object che utilizza le stesse proprietà di Get-Properties.

Quindi se si desidera che ogni proprietà su una riga con una riga vuota tra, utilizzare Format-List (in caso contrario, utilizzare Format-Table per ottenere uno per riga).

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

Sì! Avrei dovuto farlo in questo modo fin dall'inizio, invece di scherzare con nuove linee. Grazie per l'aiuto! Lo apprezzo davvero. – mike

+0

@ mike, dovresti impostare questo come risposta, giusto? – Jaykul

4

L'opzione che io tendo a usare, soprattutto perché è semplice e non ho pensare, sta usando Write-Output come di seguito. Write-Output metterà un marcatore EOL nella stringa per te e potrai semplicemente stampare la stringa finita.

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

In alternativa, si potrebbe anche solo costruire l'intera stringa utilizzando Write-Output e quindi spingere la stringa finita in Out-File.

Problemi correlati