Comment append une nouvelle ligne à la sortie de commande dans PowerShell?

J’exécute le code suivant à l’aide de PowerShell pour obtenir une liste des programmes d’ajout / suppression du registre:

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

Je veux que la liste soit séparée par des nouvelles lignes pour chaque programme. J’ai essayé:

 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 } 

Mais tous aboutissent à un formatage étrange lors de la sortie sur la console et à trois caractères carrés après chaque ligne lors de la sortie dans un fichier. J’ai essayé Format-List , Format-Table et Format-Wide sans succès. À l’origine, je pensais que quelque chose comme ça fonctionnerait:

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

Mais ça m’a juste donné une erreur.

Ou bien, définissez simplement le séparateur de champ de sortie sur double newlines, puis assurez-vous que vous obtenez une chaîne lorsque vous l’envoyez au fichier:

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

Attention à utiliser le ` et pas le ' . Sur mon clavier (disposition US-English Qwerty), il est situé à gauche du 1 .
(Déplacé ici des commentaires – Merci Koen Zomers)

Essayez ceci:

 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 

Il renvoie le texte suivant dans mon fichier addrem.txt:

 Adobe AIR Adobe Flash Player 10 ActiveX ... 

Remarque: sur mon système, GetValue (“DisplayName”) renvoie null pour certaines entrées, donc je les filtre. BTW, vous étiez proche avec ceci:

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

Sauf que dans une chaîne, si vous devez accéder à une propriété d’une variable, c’est-à-dire “évaluer une expression”, vous devez utiliser la syntaxe de sous-expression comme suit:

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

Essentiellement dans une chaîne entre guillemets, PowerShell développe des variables telles que $_ , mais n’évalue pas les expressions à moins que vous ne placiez l’expression dans une sous-expression en utilisant cette syntaxe:

 $(`). 

En fin de compte, ce que vous essayez de faire avec les lignes vierges supplémentaires entre chacune d’elles est un peu déroutant 🙂

Je pense que ce que vous voulez vraiment faire est d’utiliser Get-ItemProperty . Vous obtiendrez des erreurs lorsque des valeurs sont manquantes, mais vous pouvez les supprimer avec -ErrorAction 0 ou simplement les laisser en tant que rappels. Dans la mesure où le fournisseur de registre renvoie des propriétés supplémentaires, vous devez conserver un object Select qui utilise les mêmes propriétés que Get-Properties.

Ensuite, si vous souhaitez que chaque propriété soit sur une ligne comportant une ligne vierge, utilisez Format-List (sinon, utilisez Format-Table pour en obtenir une par ligne).

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

Je pense que vous avez eu la bonne idée avec votre dernier exemple. Vous avez seulement une erreur parce que vous essayiez de mettre des guillemets dans une chaîne déjà citée. Cela va le réparer:

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

Edit: l’opérateur $ () de Keith crée en fait une meilleure syntaxe (j’oublie toujours celle-ci). Vous pouvez également échapper les guillemets entre guillemets comme suit:

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

L’option que j’ai tendance à utiliser, principalement parce que c’est simple et que je n’ai pas besoin de penser, utilise Write-Output comme ci – dessous. Write-Output placera un marqueur EOL dans la chaîne pour vous et vous pourrez simplement sortir la chaîne terminée.

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

Alternativement, vous pouvez aussi simplement construire la chaîne entière en utilisant Write-Output et ensuite pousser la chaîne terminée dans Out-File .