我正在尝试使用 PowerShell 连接一堆 1GB 文件。通常我会在 Windows cmd.exe 中使用 来执行此操作copy /b file.txt.0+file.txt.1 file.txt
。但是,我所在的工作站已禁用 cmd.exe。 如何在 PowerShell 中运行相同的命令?当我运行完全相同的操作时,出现以下错误,
Copy-Item : A positional parameter cannot be found that accepts argument 'file.txt'.
At line:1 char:1
+ copy /c file.txt.0+file.txt.1 file.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.CopyItemCommand
我也尝试过这个,但它似乎只是用最后一个输入文件覆盖输出,
copy -Path [file.txt.0, file.txt.1] -Destination file.txt
答案1
我在帖子中 找到了一个使用 PowerShell 命令
Get-Content
而不是使用 CMD 的绝佳答案Set-Content
如何在 PowerShell 中连接两个文本文件?
以下是完整引用的答案:
只需使用
Get-Content
和Set-Content
命令:Get-Content inputFile1.txt, inputFile2.txt | Set-Content joinedFile.txt
您也可以用这种风格连接两个以上的文件。
如果源文件的名称相似,则可以使用通配符:
Get-Content inputFile*.txt | Set-Content joinedFile.txt
注1:PowerShell 5 及更早版本允许使用别名
cat
和分别sc
对Get-Content
和 进行更简洁的执行此操作Set-Content
。但是,这些别名是有问题的,因为cat
在 *nix 系统中是系统命令,sc
在 Windows 系统中是系统命令 - 因此不建议使用它们,事实上,sc
从 PowerShell Core (v7) 开始,它们甚至不再被定义。PowerShell 团队建议不要使用别名。笔记2:使用通配符时要小心 - 如果您尝试输出
inputFiles.txt
(或与模式匹配的类似内容),PowerShell 将陷入无限循环!(我刚刚测试过这个。)注 3:输出到文件时
>
不会保留字符编码!这就是为什么Set-Content
建议使用。
如果Get-Content
处理Set-Content
大文件太慢,那么流是一个不错的选择。
这是一个基于的(未经测试的)脚本 这个答案:
$rootPath = "C:\temp"
$outputPath = "C:\test\somewherenotintemp.csv"
$streamWriter = [System.IO.StreamWriter]$outputPath
Get-ChildItem $rootPath -Filter "*.csv" -File | ForEach-Object{
$file = $_.BaseName
[System.IO.File]::ReadAllLines($_.FullName) |
ForEach-Object {
$streamWriter.WriteLine(('{0},"{1}"' -f $_,$file))
}
}
$streamWriter.Close(); $streamWriter.Dispose()
您将在链接的答案中找到更多详细信息。
答案2
copy
在 PowerShell 中别名为 ,Copy-Item
它与 Dos 命令 不同copy
。follow 命令对于大文件非常有效,而且速度非常快。在我的例子中,我的 powershell 实例在连接 8x1GB 文件时使用了大约 42MB 的内存。由于我的磁盘是瓶颈,因此 CPU 使用率也很低。
cmd /c copy /b file.txt.0+file.txt.1 file.txt