如何从 PowerShell 运行 Windows 命令 shell“复制”?

如何从 PowerShell 运行 Windows 命令 shell“复制”?

我正在尝试使用 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-ContentSet-Content命令:

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

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

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

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

注1:PowerShell 5 及更早版本允许使用别名cat和分别scGet-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

相关内容