web-dev-qa-db-fra.com

Comment concaténer deux fichiers texte dans PowerShell?

J'essaie de reproduire les fonctionnalités de la commande "cat" sous Unix.

Je voudrais éviter les solutions dans lesquelles je lis explicitement les deux fichiers en variables, les concatène ensemble, puis j'écris la variable concaténée.

93
merlin2011

Vous pouvez simplement utiliser cat example1.txt, example2.txt | sc examples.txt. Vous pouvez sûrement concaténer plus de deux fichiers avec ce style également. De plus, si les fichiers portent le même nom, vous pouvez utiliser:

cat example*.txt | sc allexamples.txt

Le cat est un alias pour Get-Content , et sc est un alias pour Set-Content .

Remarque 1 : Soyez prudent avec cette dernière méthode - si vous essayez de générer en sortie examples.txt (ou similaire qui correspond au modèle), PowerShell entrera dans une boucle infinie! (Je viens de tester cela).

Note 2 : Sortie dans un fichier avec > ne conserve pas le codage des caractères! C'est pourquoi en utilisant Set-Content (sc) est recommandé.

133
Smi

Ne pas utiliser >; cela gâche l'encodage des caractères. Utilisation:

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

Dans cmd, vous pouvez faire ceci:

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

Dans PowerShell, cela serait:

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

Bien que la méthode PowerShell consisterait à utiliser gc , la procédure ci-dessus sera assez rapide, en particulier pour les fichiers volumineux. Et il peut être utilisé sur des fichiers non - ASCII en utilisant le /B _ commutateur.

13
manojlds

Vous pouvez utiliser la cmdlet Add-Content . Peut-être que c'est un peu plus rapide que les autres solutions, parce que je ne récupère pas le contenu du premier fichier.

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

Pour concaténer des fichiers dans la commande Invite, il serait

type file1.txt file2.txt file3.txt > files.txt

Powershell convertit la commande type en Get-Content, ce qui signifie que vous obtiendrez une erreur lors de l'utilisation de la commande type dans powershell car la commande Get-Content nécessite une virgule séparant les fichiers. La même commande dans PowerShell serait

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt

4
Brian Kimball

Si vous devez commander les fichiers par paramètre spécifique (par exemple, date/heure):

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log
4
Roman O

J'ai utilisé:

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append

Cela s'est bien passé. J'ai ajouté l'encodage ASCII) pour supprimer les caractères nuls que Notepad ++ affichait sans l'encodage explicite.

3
Phoenix14830

Comme la plupart des autres réponses ont souvent un formatage incorrect (à cause de la tuyauterie), la chose la plus sûre à faire est la suivante:

add-content $YourMasterFile -value (get-content $SomeAdditionalFile)

Je sais que vous vouliez éviter de lire le contenu de $ SomeAdditionalFile dans une variable, mais afin de sauvegarder, par exemple, votre mise en forme de nouvelle ligne, je ne pense pas qu'il existe un moyen approprié de le faire sans.

Une solution de contournement consisterait à parcourir votre $ SomeAdditionalFile ligne par ligne et à le transférer dans votre $ YourMasterFile. Cependant, cela nécessite trop de ressources.

2
Kamaradski

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".

1
vlad-ardelean

Je pense que la "manière de PowerShell" pourrait être:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
0
dvjz