2009-10-28 20 views
49

que ejecutar el siguiente código utilizando PowerShell para obtener una lista de Agregar/Quitar programas del registro:¿Cómo agrego una nueva línea a la salida del comando en PowerShell?

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

quiero la lista para ser separado por saltos de línea por cada programa. He intentado:

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 } 

Pero todo el resultado en formato raro cuando la salida de la consola, y con tres caracteres cuadrados después de cada línea cuando la salida a un archivo. Intenté Format-List, Format-Table y Format-Wide sin suerte. Originalmente, pensé que algo como esto funcionaría:

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

Pero eso sólo me dio un error.

Respuesta

65

O, simplemente, establecer el separador de campos de salida para las nuevas líneas dobles, y luego asegurarse de obtener una cadena cuando lo envía a archivo:

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

Tenga cuidado de usar el `y no el '. En mi teclado (diseño Qwerty estadounidense-inglés) está ubicado a la izquierda del 1. (Movido aquí de los comentarios - Gracias Koen Zomers)

+1

Esto realmente funcionó. Pero, si se agregan otros valores, es decir, $ _. GetValue ('InstallDate'), se estropea. Cumple la pregunta original, así que gracias por la ayuda. – mike

+0

Agregué una respuesta alternativa debajo de la cual creo que probablemente sea mejor :) – Jaykul

+7

Funciona muy bien. Tenga cuidado de usar el 'y no el '. En mi teclado (diseño Qwerty estadounidense-inglés) está ubicado a la izquierda del 1. –

64

seguirlo:

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 

Se produce el siguiente texto en mi archivo addrem.txt:

Adobe AIR 

Adobe Flash Player 10 ActiveX 

... 

Nota: en mi sistema, GetValue ("DisplayName") devuelve un valor nulo para algunas entradas, así que las filtro. Por cierto, estaban cerca con esto:

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

Salvo que dentro de una cadena, si necesita acceder a una propiedad de una variable, es decir, "evaluar una expresión", entonces es necesario utilizar la sintaxis subexpresión como tal :

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

Esencialmente dentro de una cadena entre comillas dobles PowerShell se expandirá variables como $_, pero no va a evaluar expresiones menos que se pone la expresión dentro de una subexpresión con esta sintaxis:

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

Intenté las dos sugerencias anteriores y el formato aún no es 100%. Cada nueva línea aparece como un pequeño cuadrado (¿unicode quizás?) En el Bloc de notas. En Wordpad todo parece estar bien, pero Word se queja de la codificación. Uso de Foreach {"$ ($ _. GetValue ('DisplayName'))' n "} aún muestra el formato incorrecto en cualquier archivo. – mike

+0

La salida predeterminada para Powershell es Unicode. Voy a modificar el ejemplo para mostrar cómo guardar en formato ASCII. –

+0

He intentado todas las opciones de codificación para fuera de archivo y ninguno de ellos me dio los resultados correctos. Revisé la variable de entorno $ OutputEncoding y todo salió en US-ASCII. Creo que voy a intentar un enfoque diferente, tal vez en Python. – mike

4

Creo que tuvo la idea correcta con su último ejemplo. Solo recibiste un error porque intentabas poner comillas dentro de una cadena ya citada. Esto lo arreglará:

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

Editar: Operador de Keith $() crea realmente un mejor sintaxis (siempre me olvido de éste). También puede escapar comillas comillas como tan:

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

Esta es la respuesta correcta a la pregunta. Esta debería ser la respuesta aceptada. –

6

En última instancia, lo que está tratando de hacer con las líneas en blanco EXTRA entre cada uno es un poco confuso :)

Creo que lo que realmente quieres hacer es usar Get-ItemProperty. Obtendrá errores cuando falten valores, pero puede suprimirlos con -ErrorAction 0 o simplemente dejarlos como recordatorios.Debido a que el proveedor del Registro devuelve propiedades adicionales, le conviene incluir un Select-Object que utiliza las mismas propiedades que las Get-Properties.

Luego, si desea que cada propiedad en una línea con una línea en blanco entre, use Format-List (de lo contrario, use Format-Table para obtener una por línea).

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

¡Sí! Debería haberlo hecho así desde el principio, en lugar de jugar con nuevas líneas. ¡Gracias por la ayuda! Realmente lo aprecio. – mike

+0

@mike, debes establecer esta como la respuesta, ¿verdad? – Jaykul

4

La opción que tiendo a utilizar, sobre todo porque es sencilla y no tener que pensar, está utilizando Write-Output de la siguiente manera. Write-Output pondrá un marcador EOL en la cadena para usted y usted simplemente puede dar salida a la cadena terminada.

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

Como alternativa, puede también acaba de construir toda la cadena mediante escritura de salida y luego empujar la cadena terminada en Out-File.

Cuestiones relacionadas