what start principales open how comandos basicos activar powershell newline

start - ¿Cómo agrego una nueva línea al resultado del comando en PowerShell?



principales comandos de powershell (5)

Ejecuto el siguiente código usando PowerShell para obtener una lista de programas para agregar / quitar del registro:

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

Quiero que la lista esté separada por líneas nuevas 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 todos dan como resultado un formato extraño cuando se envía a la consola, y con tres caracteres cuadrados después de cada línea cuando se envía a un archivo. Probé 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 solo me dio un error.


Creo que tuviste la idea correcta con tu ú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") }

Edición: el operador $ () de Keith realmente crea una sintaxis mejor (siempre me olvido de esta). También puede escapar las comillas dentro de las comillas así:

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


En última instancia, lo que estás 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 usa las mismas propiedades que las Get-Properties.

Luego, si desea que cada propiedad esté en una línea con una línea en blanco, utilice 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


La opción que tiendo a usar, sobre todo porque es simple y no tengo que pensar, está usando Write-Output como a continuación. 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

Alternativamente, también puede construir la cadena completa usando Write-Output y luego insertar la cadena terminada en Out-File .


O bien, simplemente configure el separador del campo de salida para duplicar las nuevas líneas, y luego asegúrese de obtener una cadena cuando la envíe al 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)


Prueba esto:

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

Da el siguiente texto en mi archivo addrem.txt:

Adobe AIR Adobe Flash Player 10 ActiveX ...

Nota: en mi sistema, GetValue ("DisplayName") devuelve null para algunas entradas, por lo que las filtraré. Por cierto, estabas cerca de esto:

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

Excepto que dentro de una cadena, si necesita acceder a una propiedad de una variable, es decir, "evaluar una expresión", entonces necesita usar la sintaxis de subexpresión de la siguiente manera:

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

Esencialmente dentro de una cadena con comillas dobles, PowerShell ampliará variables como $_ , pero no evaluará las expresiones a menos que coloque la expresión dentro de una subexpresión usando esta sintaxis:

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