Sto cercando di replicare la funzionalità del cat
comando in Unix.
Vorrei evitare soluzioni in cui leggo esplicitamente entrambi i file in variabili, concateno le variabili insieme e quindi scrivo la variabile concatenata.
Sto cercando di replicare la funzionalità del cat
comando in Unix.
Vorrei evitare soluzioni in cui leggo esplicitamente entrambi i file in variabili, concateno le variabili insieme e quindi scrivo la variabile concatenata.
Risposte:
Puoi semplicemente usare cat example1.txt, example2.txt | sc examples.txt
. Puoi sicuramente concatenare anche più di due file con questo stile. Inoltre, se i file hanno nomi simili, puoi usare:
cat example*.txt | sc allexamples.txt
Il cat
è un alias per Get-Content
, ed sc
è un alias per Set-Content
.
Nota 1 : fai attenzione con quest'ultimo metodo: se provi a eseguire l'output in examples.txt
(o simile che corrisponde al modello), PowerShell entrerà in un ciclo infinito! (L'ho appena testato).
Nota 2 : l'output in un file con >
non preserva la codifica dei caratteri! Questo è il motivo per cui si consiglia di utilizzare Set-Content
( sc
).
Set-Content
utilizza la code page nazionale (ad esempio Windows-1252 per l'inglese). Se i file sorgente contengono altra codifica (ad esempio Windows-1251 o UTF8), è necessario impostare la codifica corretta sc file.txt -Encoding UTF8
(numeri come 1251 per il russo sono supportati dalla v6.2)
Add-Content
è che se esegui il comando due volte, il file aggregato è lungo il doppio. Un buon sostituto è Out-File
. Esempio qui
Get-Content my.bin -Raw | Set-Content my.bin -NoNewline
non cambierà my.bin
tranne i timestamp. -Raw
conserva tutti i byte CR / LF, mentre -NoNewline
impedisce a PowerShell di aggiungere i propri byte CR / LF.
Non utilizzare >
; rovina la codifica dei caratteri. Uso:
Get-Content files.* | Set-Content newfile.file
cat
è un alias per Get-Content
.
ÿþ
che è FF FE
all'inizio del mio file concatenato durante l'utilizzo >
.
In cmd
, puoi farlo:
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 usare gc , quanto sopra sarà abbastanza veloce, specialmente per file di grandi dimensioni. E può essere utilizzato anche su file non ASCII utilizzando l' /B
interruttore.
È 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
gc
riferisce?
gc
è un alias per Get-Content
Per concatenare i file nel prompt dei comandi sarebbe
type file1.txt file2.txt file3.txt > files.txt
PowerShell converte il type
comando in Get-Content
, il che significa che riceverai un errore quando usi il type
comando in PowerShell perché il Get-Content
comando 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
Ero solito:
Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log
-Encoding ASCII -Append
Questo aggiunto bene. Ho aggiunto la codifica ASCII per rimuovere i caratteri nul che Notepad ++ mostrava senza la codifica esplicita.
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 ha una formattazione errata (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 formattazione di nuova riga non penso che ci sia un modo corretto per farne a meno.
Una soluzione alternativa potrebbe essere quella di scorrere il tuo $ SomeAdditionalFile riga per riga e collegarlo al tuo $ YourMasterFile. Tuttavia questo è eccessivamente dispendioso in termini di risorse.