J'essaye de reproduire la fonctionnalité de la cat
commande sous Unix.
Je voudrais éviter les solutions où je lis explicitement les deux fichiers dans des variables, concatène les variables ensemble, puis écris la variable concaténée.
J'essaye de reproduire la fonctionnalité de la cat
commande sous Unix.
Je voudrais éviter les solutions où je lis explicitement les deux fichiers dans des variables, concatène les variables ensemble, puis écris la variable concaténée.
Réponses:
Vous pouvez simplement utiliser cat example1.txt, example2.txt | sc examples.txt
. Vous pouvez également concaténer plus de deux fichiers avec ce style. De plus, si les fichiers sont nommés de la même manière, 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 une sortie vers examples.txt
(ou similaire qui correspond au modèle), PowerShell entrera dans une boucle infinie! (Je viens de tester ça).
Remarque 2 : La sortie dans un fichier avec >
ne préserve pas le codage des caractères! C'est pourquoi il est recommandé d' utiliser Set-Content
( sc
).
Set-Content
utilise la page de codes nationale (par exemple Windows-1252 pour l'anglais). Si les fichiers source contiennent un autre codage (par exemple, Windows-1251 ou UTF8), vous devez définir un codage correct sc file.txt -Encoding UTF8
(des nombres tels que 1251 pour le russe sont pris en charge depuis la v6.2)
Add-Content
est que si vous exécutez la commande deux fois, le fichier agrégé est deux fois plus long. Un bon remplacement est Out-File
. Exemple ici
Get-Content my.bin -Raw | Set-Content my.bin -NoNewline
ne changera pas my.bin
sauf les horodatages. -Raw
préserve tous les octets CR / LF, tout en -NoNewline
empêchant PowerShell d'ajouter ses propres octets CR / LF.
Ne pas utiliser >
; cela perturbe l'encodage des caractères. Utilisation:
Get-Content files.* | Set-Content newfile.file
cat
est un alias pour Get-Content
.
ÿþ
qui est FF FE
au début de mon fichier concaténé lors de l'utilisation >
.
Dans cmd
, vous pouvez faire ceci:
copy one.txt+two.txt+three.txt four.txt
Dans PowerShell, ce serait:
cmd /c copy one.txt+two.txt+three.txt four.txt
Alors que la manière PowerShell serait d'utiliser gc , ce qui précède sera assez rapide, en particulier pour les fichiers volumineux. Et il peut également être utilisé sur des fichiers non ASCII en utilisant le /B
commutateur.
Vous pouvez utiliser l' applet de commande Add-Content . C'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
gc
référence?
gc
est un alias pour Get-Content
Pour concater des fichiers dans l'invite de commande, ce serait
type file1.txt file2.txt file3.txt > files.txt
PowerShell convertit la type
commande en Get-Content
, ce qui signifie que vous obtiendrez une erreur lors de l'utilisation de la type
commande dans PowerShell, car la Get-Content
commande 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
J'ai utilisé:
Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log
-Encoding ASCII -Append
Cette amende ajoutée. J'ai ajouté le codage ASCII pour supprimer les caractères nuls que Notepad ++ montrait sans le codage explicite.
Vous pouvez faire quelque chose comme:
get-content input_file1 > output_file
get-content input_file2 >> output_file
Où >
est un alias pour "out-file", et >> est un alias pour "out-file -append".
Étant donné que la plupart des autres réponses ont souvent une mauvaise mise en forme (en raison 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 pour enregistrer par exemple votre mise en forme de nouvelle ligne, je ne pense pas qu'il y ait un moyen approprié de le faire sans.
Une solution de contournement serait de parcourir votre $ SomeAdditionalFile ligne par ligne et de le rediriger vers votre $ YourMasterFile. Cependant, cela demande trop de ressources.