Como faço para adicionar uma nova linha para a saída de comando no PowerShell?

StackOverflow https://stackoverflow.com/questions/1639291

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu corro o seguinte código usando o PowerShell para obter uma lista de programas de adicionar / remover do registro:

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

Eu quero a lista para ser separados por novas linhas por cada programa. Eu tentei:

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 }

Mas tudo resultado na formatação estranho quando a saída para o console, e com três personagens quadrados após cada linha quando a saída para um arquivo. Tentei Format-List, Format-Table e Format-Wide sem sorte. Originalmente, eu pensei que algo como isso iria funcionar:

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

Mas isso só me deu um erro.

Foi útil?

Solução

Ou então, basta definir o saída de campo separador (OFS) para novas linhas duplas, e, em seguida, ter certeza de obter uma corda quando você enviá-lo para o arquivo:

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

Tenha cuidado para usar o ` e não o '. No meu teclado (layout de US-Inglês Qwerty) ele está localizado à esquerda do 1 .
(Transferida aqui do comentários - Graças Koen Zomers)

Outras dicas

Tentar dar um presente:

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

Ela produz o seguinte texto no meu arquivo addrem.txt:

Adobe AIR

Adobe Flash Player 10 ActiveX

...

Nota: no meu sistema, GetValue ( "DisplayName") retorna nulo para algumas entradas, então eu filtrar aqueles fora. BTW, você estava perto com este:

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

Só que dentro de uma cadeia, se você precisar acessar uma propriedade de uma variável, ou seja, "avaliar uma expressão", então você precisa usar a sintaxe subexpression assim:

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

Essencialmente dentro de uma cadeia entre aspas dupla PowerShell irá expandir variáveis ??como $_, mas não vai avaliar expressões menos que você colocar a expressão dentro de uma sub-expressão usando a seguinte sintaxe:

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

Em última análise, o que você está tentando fazer com as linhas em branco extra entre cada um é um pouco confuso :)

Eu acho que você realmente quer fazer é usar Get-ItemProperty . Você vai obter erros quando os valores estão faltando, mas você pode suprimi-los com -ErrorAction 0 ou apenas deixá-los como lembretes. Porque o provedor retorna Registro propriedades extras, você vai querer ficar em um Select- objeto que usa as mesmas propriedades que o começo Propriedades.

Então, se você quiser cada propriedade em uma linha com uma linha em branco entre, uso Format-List (caso contrário, use Format-Table para obter um por linha).

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

Eu acho que você teve a idéia correta com o seu último exemplo. Você só tem um erro porque você estava tentando colocar aspas dentro de uma string já citado. Isto irá corrigi-lo:

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

Edit: $ Keith () operador realmente cria uma sintaxe melhor (eu sempre esquecer-se sobre este). Você também pode escapar aspas dentro de aspas, como assim:

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

A opção que eu tendem a usar, principalmente porque é simples e eu não tenho que pensar, está usando Write-Output como abaixo. Write-Output vai colocar um marcador EOL na seqüência para você e você pode simplesmente saída a seqüência final.

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

Como alternativa, você também pode apenas construir a seqüência inteira usando Write-Output e empurre a seqüência final em out-File.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top