123 votes

Comment concaténer deux fichiers texte dans PowerShell ?

J'essaie de reproduire la fonctionnalité de l'application cat dans Unix.

Je voudrais éviter les solutions où je dois explicitement lire les deux fichiers dans des variables, concaténer les variables ensemble, puis écrire la variable concaténée.

199voto

Smi Points 4856

Il suffit d'utiliser le Get-Content et Set-Content cmdlets :

Get-Content inputFile1.txt, inputFile2.txt | Set-Content joinedFile.txt

Vous pouvez également concaténer plus de deux fichiers avec ce style.

Si les fichiers sources sont nommés de manière similaire, vous pouvez utiliser des caractères génériques :

Get-Content inputFile*.txt | Set-Content joinedFile.txt

Note 1 : PowerShell 5 et les versions antérieures permettaient de le faire de manière plus concise en utilisant les alias suivants cat et sc pour Get-Content et Set-Content respectivement. Cependant, ces alias sont problématiques car cat est une commande système dans les systèmes *nix, et sc est une commande système dans les systèmes Windows - leur utilisation n'est donc pas recommandée, et en fait sc n'est même plus défini à partir de PowerShell Core (v7). L'équipe PowerShell recommande de ne pas utiliser d'alias en général .

Note 2 : Soyez prudent avec les caractères de remplacement - si vous essayez d'envoyer la sortie à inputFiles.txt (ou similaire qui correspond au modèle), PowerShell va entrer dans une boucle infinie ! (Je viens de le tester.)

Note 3 : Sortie vers un fichier avec > ne préserve pas l'encodage des caractères ! C'est pourquoi l'utilisation de Set-Content est recommandé.

6 votes

Au cas où quelqu'un voudrait itérer sur des fichiers avec la fonction Get-ChildItems | Foreach-Object la construction, vous pourriez vouloir utiliser Add-Content au lieu de Set-Content. Sinon, le fichier cible est écrasé à chaque itération.

1 votes

Notez que par défaut Set-Content utilise la page de code nationale (par exemple, Windows-1252 pour l'anglais). Si les fichiers sources contiennent un autre codage (par exemple Windows-1251 ou UTF8), vous devez définir le codage correct. sc file.txt -Encoding UTF8 (les numéros tels que 1251 pour le russe sont supportés depuis la v6.2)

0 votes

@Jonas Le problème avec Add-Content est que si vous exécutez la commande deux fois, le fichier agrégé est deux fois plus long. Une bonne solution de remplacement est Out-File . Exemple ici

63voto

user2074686 Points 81

Ne pas utiliser > ; cela perturbe l'encodage des caractères. Utilisez :

Get-Content files.* | Set-Content newfile.file

0 votes

cat est un alias pour Get-Content .

5 votes

@n0rd Je pense qu'il s'agissait plutôt d'un truc du genre "utiliser le pipeline à la place".

0 votes

Peut confirmer. Je recevais ÿþ qui est FF FE au début de mon fichier concaténé lors de l'utilisation de > .

18voto

manojlds Points 96599

Sur cmd vous pouvez le faire :

copy one.txt+two.txt+three.txt four.txt

En PowerShell, ce serait :

cmd /c copy one.txt+two.txt+three.txt four.txt

Alors que la méthode PowerShell serait d'utiliser gc le système ci-dessus sera assez rapide, surtout pour les gros fichiers. Et on peut l'utiliser sur des sites autres que ASCII aussi en utilisant le /B interrupteur.

3 votes

Pour moi, la commande cat est plus longue de plusieurs ordres de grandeur que la commande cmd /c (qui est très rapide) ; merci de m'avoir signalé cette option !

0 votes

C'est la meilleure réponse.

13voto

mjsr Points 1781

Vous pourriez utiliser le Add-Content cmdlet. Elle est peut-être un peu plus rapide que les autres solutions, car je ne récupère pas le contenu du premier fichier.

gc .\file2.txt| Add-Content -Path .\file1.txt

0 votes

A quoi sert gc se référer ?

0 votes

gc est un alias de Get-Content

2voto

vlad-ardelean Points 1885

Vous pouvez faire quelque chose comme :

get-content input_file1 > output_file
get-content input_file2 >> output_file

> est un alias pour "out-file", et >> est un alias pour "out-file -append".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X