Come concatenare due file di testo in PowerShell?

Sto cercando di replicare la funzionalità del comando “cat” in Unix.

Vorrei evitare soluzioni in cui leggo esplicitamente entrambi i file in variabili, concatenando insieme le variabili e quindi scrivendo la variabile concatenata.

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

 cat example*.txt | sc allexamples.txt 

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

Nota 1 : Prestare attenzione con il secondo metodo: se si tenta di eseguire l’output in examples.txt (o simili che corrispondono al modello), PowerShell entrerà in un ciclo infinito! (Ho appena provato questo).

Nota 2 : l’output in un file con > non conserva la codifica dei caratteri! Questo è il motivo per cui è consigliabile utilizzare Set-Content ( sc ).

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

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

Mi ci sono volute ore per scoprirlo.

In cmd puoi 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 in cui PowerShell sarebbe utilizzare gc , quanto sopra sarà piuttosto veloce, specialmente per file di grandi dimensioni. E può essere utilizzato anche su file non ASCII usando l’opzione /B

È ansible utilizzare il cmdlet Aggiungi contenuto . Forse è un po ‘più veloce delle altre soluzioni, perché non recupero il contenuto del primo file.

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

Per concatenere i file nel prompt dei comandi sarebbe

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

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

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

Ero solito:

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

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

Se è necessario ordinare i file in base a un parametro specifico (ad esempio, l’ora):

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

Puoi fare qualcosa come:

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

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

Poiché la maggior parte delle altre risposte spesso non ha la formattazione corretta (a causa delle tubazioni), la cosa più sicura da fare è la seguente:

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

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

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

Penso che il “modo di Powershell” potrebbe essere:

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