在不使用任何第三方软件的情况下通过 power-shell 并行复制多个文件?

Copying multiple files in parallel through power-shell without using any third party software?

问题陈述: 我正在尝试将 100 个文件(每个文件的大小都超过 1 GB)从源目录复制到目标目录,我正在通过 power-shell 脚本自动执行此操作。在执行脚本时,复制操作是按顺序复制文件。有什么方法可以并行复制它们以减少一些时间,因为复制所有文件需要很多时间并且使用任何第三方软件都有限制。

    $DATAFileDir="D:\TEST_FOLDER\DATAFILESFX\*"
    $LOGFileDir="D:\TEST_FOLDER\LOGFILESFX\*"
    $DestDataDir="D:\TEST_FOLDER\Data\"
    $DestLogDir="D:\TEST_FOLDER\Log\"

    #Copying the Primary file
    Copy-Item -Path $DATAFileDir -Destination $DestDataDir -Recurse -Force -Verbose
    #Copying the Audit File
    Copy-Item -Path $LOGFileDir -Destination $DestLogDir -Recurse -Force -Verbose

有什么建议吗?

您可以为每个要复制的文件启动作业单独进程。

$Source = Get-ChildItem -Path C:\SourceFolder -Recurse | Select -ExpandProperty FullName
$Destination = 'C:\DestinationFolder'
foreach ($Item in @($Source)){
    #starting job for every item in source list
    Start-Job -ScriptBlock {
        param($Item,$Destination) #passing parameters for copy-item 
            #doing copy-item
            Copy-Item -Path $Item -Destination $Destination -Recurse  -Force
    } -ArgumentList $Item,$Destination #passing parameters for copy-item 
}

您应该可以使用 powershell workflow 轻松实现此目的。 throttlelimit 将限制并行复制的文件数。删除它以并行复制所有文件(可能不建议 100 个文件)。

workflow copyfiles {

    param($files)

    foreach -parallel -throttlelimit 3 ($file in $files) {

        Copy-Item -Path $file -Destination 'C:\destination\' -Force -verbose
    }
}

$files = Get-ChildItem -Path C:\source -Recurse -File

copyfiles $files.FullName

此 powershell 脚本直接使用 .NET Framework 类,执行速度应该更快,即使对于很多文件也是如此。使用 throttlelimit 来控制您需要多少并行化。

param([String]$argSourceRootDir,[String]$argTargetRootDir)

workflow copyfiles {

    param($sourceRootDir, $targetRootDir)

    $sourcePaths = [System.IO.Directory]::GetFiles($sourceRootDir, "*.*", "AllDirectories")

    foreach -parallel -throttlelimit 8 ($sourcePath in $sourcePaths) {

        $targetPath = $sourcePath.Replace($sourceRootDir, $targetRootDir)
        $targetDir = $targetPath.Substring(0, $targetPath.Length - [System.IO.Path]::GetFileName($targetPath).Length - 1)
        if(-not (Test-Path $targetDir))
        {
            $x = [System.IO.Directory]::CreateDirectory($targetDir)
            $z = [Console]::WriteLine("new directory: $targetDir")
        }
        $z = [Console]::WriteLine("copy file: $sourcePath => $targetPath")
        $x = [System.IO.File]::Copy($sourcePath, $targetPath, "true")
    }
}

copyfiles $argSourceRootDir $argTargetRootDir

只需将此代码保存为 ParallelCopy.ps1 和 运行,如下所示:

. ParallelCopy.ps1 "C:\Temp\SourceDir" "C:\Temp\TargetDir"

或者你可以使用 start-threadjob。如果你有 ps5,你可以从图库中获取 threadjob。 https://powershellgallery.com/packages/ThreadJob/2.0.0 Or foreach-object -parallel in ps 7 https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/

开始位传输? https://docs.microsoft.com/en-us/powershell/module/bitstransfer/start-bitstransfer?view=win10-ps

start-bitstransfer z:\files\*.iso c:

如果所有 100 个文件都发布到单个 redshift table,那么, Redshift 能够使用单个复制命令并行加载多个文件。 查看 redshift 文档:https://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html