PowerShellで2つのテキストファイルを連結するにはどうすればよいですか?


108

私はの機能を複製しようとしています catUnixでコマンド。

両方のファイルを明示的に変数に読み込み、変数を連結して、連結された変数を書き出すという解決策は避けたいです。

回答:


170

単純に使用できますcat example1.txt, example2.txt | sc examples.txt。このスタイルで2つ以上のファイルを確実に連結することもできます。さらに、ファイルの名前が同じであれば、次のように使用できます。

cat example*.txt | sc allexamples.txt

cat別名であるGet-Content、とscの別名ですSet-Content

注1:後者の方法には注意してください- examples.txt(またはパターンに一致する同様の)に出力しようとすると、PowerShellが無限ループに入ります!(私はこれをテストしました)。

注2:でファイルに出力すると、>文字エンコードは保持されません。Set-Contentsc)の使用が推奨されるのはこのためです。


5
誰かがGet-ChildItemsでファイルを反復処理したい場合に備えて| Foreach-Objectコンストラクトでは、Set-ContentではなくAdd-Contentを使用できます。それ以外の場合、ターゲットファイルは各反復で上書きされます。
ジョナス

1
デフォルトでSet-Contentは国別コードページを使用することに注意してください(英語版のWindows-1252など)。ソースファイルに他のコーディング(Windows-1251やUTF8など)が含まれている場合は、正しいエンコードを設定する必要がありますsc file.txt -Encoding UTF8(ロシア語の1251などの番号はv6.2以降でサポートされています)
Radek Pech

@Jonasの問題Add-Contentは、コマンドを2回実行すると、集約されたファイルが2倍になることです。良い代替品はOut-Fileです。ここの
Dan Friedman

1
ファイルがバイナリの場合は機能しないようです(たとえば、私の場合はzipファイルの一部)。
DanielLidström

1
@DanielLidströmこれは、正しいパラメーターを持つバイナリーでも機能します。タイムスタンプ以外はGet-Content my.bin -Raw | Set-Content my.bin -NoNewline変更されませんmy.bin。PowerShellが独自のCR / LFバイトを追加するの-Raw-NoNewline防ぎながら、CR / LFバイトを保持します。
トーマス

62

使用しないでください>。それは文字エンコーディングを台無しにします。使用する:

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

catのエイリアスですGet-Content
n0rd

5
@ n0rdむしろ「代わりにパイプラインを使用する」ことだと思います。
ksoo 2016年

確認できます。を使用すると、私の連結ファイルの先頭にÿþあるものが取得されていFF FEました>
gpresland

16

ではcmd、これを行うことができます:

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

PowerShellでは、次のようになります。

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

PowerShellの方法はgcを使用することですが、上記は特に大きなファイルの場合はかなり高速になります。また、スイッチを使用して、非ASCIIファイルでも使用できます/B


3
私にとって、catコマンドは、cmd / cコマンド(非常に高速に実行されます)よりも数桁長く実行されます。オプションを指摘してくれてありがとう!
Rob

これが最良の答えです。
Nicholas DiPiazza

12

Add-Contentコマンドレットを使用できます。最初のファイルのコンテンツを取得しないので、他のソリューションより少し速いかもしれません。

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

何をgc指しますか?
タコグラブバス

gcGet-Content
MMの

8

コマンドプロンプトでファイルを連結するには、

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

PowerShellはtypeコマンドをGet-Contentに変換します。typeつまり、Get-Contentコマンドはファイルを区切るためにコンマを必要とするため、PowerShellでコマンドを使用するとエラーが発生します。PowerShellの同じコマンドは

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

5

特定のパラメーター(日時など)でファイルを並べ替える必要がある場合:

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

3

私が使用した:

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

これで結構です。ASCIIエンコーディングを追加して、Notepad ++が明示的なエンコーディングなしで表示していたNUL文字を削除しました。


2

次のようなことができます:

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

どこに>「アウト・ファイル」の別名がある、と>>「アウト・ファイル-append」の別名です。


2

他のほとんどの返信では、(パイプ処理のために)形式が間違っていることが多いため、最も安全な方法は次のとおりです。

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

$ SomeAdditionalFileの内容を変数に読み込まないようにしたかったのですが、たとえば改行の書式を保存するために、それを行わない適切な方法はないと思います。

回避策は、$ SomeAdditionalFileを1行ずつループし、それを$ YourMasterFileにパイプすることです。ただし、これは過度にリソースを消費します。


1

エンコーディングと行末を維持するには:

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

注:AFAIR、そのパラメーターは古いPowershellでサポートされていません(<3?<4?)


0

「パワーシェルの方法」は次のようになると思います:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.