2012-01-05 20 views

risposta

80

È possibile utilizzare semplicemente cat example1.txt, example2.txt | sc examples.txt. Puoi sicuramente concatenare più di due file con questo stile. Inoltre, se i file sono denominati in modo simile, è possibile utilizzare:

cat example*.txt | sc allexamples.txt 

Il cat è un alias per Get-Content, e sc è un alias per Set-Content.

Nota 1: Fare attenzione con il secondo metodo - se si tenta di uscita a examples.txt (o simile che corrisponde al modello), PowerShell sarà entrare in un ciclo infinito! (Ho appena provato questo).

Nota 2: l'output su un file con > non conserva la codifica dei caratteri! Questo è il motivo per cui è consigliato l'uso di Set-Content (sc).

+0

Solo nel caso qualcuno vuole per scorrere i file sopra con il _GET -ChildItems | Costrutto Foreach-Object_ si potrebbe voler usare Add-Content invece di Set-Content. In caso contrario, il file di destinazione viene sovrascritto in ogni iterazione. – Jonas

1

Si può fare qualcosa di simile:

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

Dove > è un alias per "out-file", e >> è un alias per "-append out-file".

12

In cmd, si può fare questo:

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

In PowerShell questo sarebbe:

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

Mentre il modo PowerShell sarebbe quella di utilizzare gc, quanto sopra sarà piuttosto veloce, soprattutto per file di grandi dimensioni. E può essere utilizzato anche su file non ASCII utilizzando lo switch /B.

+2

Per me il comando cat esegue più ordini di grandezza più lunghi del comando cmd/c (che funziona molto velocemente); grazie per aver sottolineato l'opzione! – Rob

10

È possibile utilizzare il cmdlet Add-Content. Forse è un po 'più veloce delle altre soluzioni, perché non recupero il contenuto del primo file.

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

Non utilizzare cat ... >; incasina la codifica dei caratteri. Uso:

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

Mi ci sono volute ore per scoprirlo.

+0

'cat' è un alias per' Get-Content'. – n0rd

+3

@ n0rd Penso che sia più un "usare la pipeline invece" cosa. – ksoo

1

Poiché la maggior parte delle altre risposte spesso ottenere la formattazione sbagliata (a causa della tubazione), la cosa più sicura da fare è la seguente:

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

So che si voleva evitare di leggere il contenuto di $ SomeAdditionalFile in una variabile, ma per salvare ad esempio la tua nuova formattazione non penso che ci sia il modo corretto per farlo senza.

Una soluzione alternativa consiste nel passare in loop $ SomeAdditionalFile riga per riga e eseguire il piping in $ YourMasterFile. Tuttavia questo è eccessivamente dispendioso in termini di risorse.

3

ho usato:

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

Questo raffinato allegate. Ho aggiunto la codifica ASCII per rimuovere i caratteri nul che Notepad ++ mostrava senza la codifica esplicita.

0

Credo che la "via PowerShell" potrebbe essere:

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

Per concat file in Prompt dei comandi sarebbe

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

PowerShell converte il comando tipo di Get-Content, che significa che si verificherà un errore quando si utilizza il comando type in powershell poiché il comando Get-Content richiede una virgola che separa i file. Lo stesso comando in PowerShell sarebbe

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

1

Se hai bisogno di ordinare i file per il parametro specifico (ad esempio data e ora):

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