如何在 PowerShell 中连接两个文本文件?

我试图在 Unix 中复制 cat命令的功能。

我希望避免这样的解决方案: 显式地将两个文件读入变量,将变量连接在一起,然后写出连接的变量。

176080 次浏览

只需使用 Get-ContentSet-Content cmdlet:

Get-Content inputFile1.txt, inputFile2.txt | Set-Content joinedFile.txt

您也可以用这种样式连接两个以上的文件。

如果源文件的命名类似,则可以使用通配符:

Get-Content inputFile*.txt | Set-Content joinedFile.txt

注1: PowerShell 5和更老的版本允许分别使用 Get-ContentSet-Content的别名 catsc更简洁地完成此操作。然而,这些别名是有问题的,因为 cat是 * nix 系统中的一个系统命令,而 sc是 Windows 系统中的一个系统命令——因此不推荐使用它们,事实上,甚至在 PowerShell Core (v7)中也不再定义 sc。PowerShell 团队 建议一般不要使用别名

注意2 : 小心通配符-如果您试图输出到 inputFiles.txt(或类似的匹配模式) ,PowerShell 将进入一个无限循环!(我刚测试过这个)

注3 : 输出到使用 >的文件不能保存字符编码,这就是为什么推荐使用 Set-Content

你可以这样做:

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

其中 >是“ out-file”的别名,> > 是“ out-file-append”的别名。

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开关。

您可以使用 添加内容 cmdlet。也许它比其他解决方案稍微快一点,因为我不检索第一个文件的内容。

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

不要使用 >,因为它会弄乱字符编码。使用:

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

由于大多数其他回复的格式经常错误(由于管道) ,最安全的做法如下:

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

我知道您希望避免将 $Some AdditionalFile 的内容读入一个变量,但是为了保存例如您的换行格式,我认为没有适当的方法可以做到这一点。

一个变通方法是逐行循环通过 $Some AdditionalFile,并将其管道化到 $YourMasterFile 中。然而,这是过度的资源密集型。

我用:

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

我添加了 ASCII 编码来删除 Notepad + + 在没有显式编码的情况下显示的空字符。

我认为“强力壳方式”可以是:

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

要在命令提示符下连接文件,应该是

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

PowerShell 将 type命令转换为 Get-Content,这意味着在 PowerShell 中使用 type命令时将出现错误,因为 Get-Content命令需要用逗号分隔文件。PowerShell 中的相同命令将是

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

如果你需要根据特定的参数(例如日期时间)对文件进行排序:

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

保持编码和行结尾:

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

注意: AFAIR,其参数不受旧 Powershell (< 3? < 4?)的支持