web-dev-qa-db-fra.com

Empêcher la fin de la nouvelle ligne dans la commande PowerShell Out-File

Comment puis-je empêcher la commande Out-File de PowerShell d'ajouter une nouvelle ligne après le texte qu'elle génère?

Par exemple, l'exécution de la commande suivante produit un fichier avec le contenu "TestTest\r\n" plutôt que simplement "TestTest".

"TestTest" | Out-File -encoding ascii test.txt
23
Matt

Dans PowerShell 5.0+, vous utiliseriez:

"TestTest" | Out-File -encoding ascii test.txt -NoNewline

Mais dans les versions antérieures, vous ne pouvez tout simplement pas utiliser cette applet de commande.

Essaye ça:

[System.IO.File]::WriteAllText($FilePath,"TestTest",[System.Text.Encoding]::ASCII)
34
briantist

À complémentréponse utile du briantiste re -NoNewline:

Ce qui suit s'applique non seulement à Out-File, Mais également à Set-Content/Add-Content; comme indiqué, -NoNewline nécessite PSv5 +.

Notez que -NoNewline signifie qu'avec multiple les objets à sortie , ce n'est pas seulement un suivi newline (saut de ligne) qui est supprimé, mais any newlines.

En d'autres termes: les représentations de chaîne des objets d'entrée sont directement concaténées, sans séparateur (terminateur) .

Par conséquent, les commandes suivantes génèrent le même contenu de fichier (TestTest sans retour à la ligne):

# Single input string
"TestTest" | Out-File -encoding ascii test.txt -NoNewline

# Equivalent command: 2-element array of strings that are directly concatenated.
"Test", "Test" | Out-File -encoding ascii test.txt -NoNewline

Pour placer des sauts de ligne uniquement entre, mais pas aussi après la sortie objets, vous devez joindre les objets avec des sauts de ligne explicitement :

"Test", "Test" -join "`r`n" | Out-File -encoding ascii test.txt -NoNewline

Pour créer des sauts de ligne LF uniquement Unix, utilisez "`n" Au lieu de "`r`n".

Avertissement :

La solution -join Ci-dessus convertit implicitement les objets d'entrée en chaînes, s'ils ne le sont pas déjà et le fait en appelant la méthode .NET .ToString() sur chaque objet, ce qui donne souvent une représentation différente de celle celui que Out-File créerait directement, parce que Out-File utilise le PowerFell formateur de sortie par défaut; par exemple, comparez les sorties de (Get-Date).ToString() et seulement Get-Date.

Si votre entrée comprend uniquement des chaînes et/ou des non-chaînes dont la représentation .ToString() est satisfaisante , la solution ci-dessus fonctionne, mais notez que il est alors généralement préférable d'utiliser l'applet de commande Set-Content, qui applique implicitement la même stringification.
Pour une discussion complète des différences entre Out-File Et Set-Content, Voir cette réponse à moi.

Si votre entrée contient des non-chaînes que vous souhaitez mettre en forme comme elles s'imprimeraient sur la console, il n'y a en fait pas de solution simple: alors que vous pouvez utiliser Out-String Pour créer des représentations de chaînes par objet avec le formateur par défaut , Le manque de Out-String De -NoNewline (À partir de la v5.1; ce problème GitHub suggère de l'introduire) donnerait invariablement des nouvelles lignes de fin.

8
mklement0