powershell 通过power-shell并行复制多个文件,而不使用任何第三方软件?

km0tfn4u  于 2023-06-23  发布在  Shell
关注(0)|答案(6)|浏览(166)

**问题陈述:**我试图将100个文件(每个文件的大小都超过了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

有什么建议吗?

gmxoilav

gmxoilav1#

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

$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 
}
uz75evzq

uz75evzq2#

您应该能够使用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
g2ieeal7

g2ieeal73#

您可以将robocopy/move/mt:n参数一起使用。最快的语法:

function RoboMove ([string]$From, [string]$To, [int]$Threads = 8) {

    Invoke-Expression ("[void](robocopy /move /mt:$Threads /s /z /nfl /ndl /njh /njs /nc /ns /np '$From' '$To')")

    if (Test-Path $From) {
        Remove-Item $From
    }
}

要实现最大的并行化,您需要知道卷是SSD还是HDD。HDD的安全值为8,SSD为128。
SSD检测可以通过以下代码段自动进行,但如果您有RAID或某种存储空间,它会给予一些非致命错误。

function DetectVolumeType ([string]$Path) {

    $DriveLetter = $Path[0]
    $IsSSD = $False

    foreach ($Drive in Get-PhysicalDisk) {

        if ((($Drive | Get-Disk | Get-Partition).DriveLetter -Contains $DriveLetter) -and ($Drive.MediaType -eq 'SSD')) {

            $IsSSD = $True
            break
        }
    }
    return $IsSSD
}

文件:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

jv2fixgn

jv2fixgn4#

或者你可以使用start-threadjob。如果你有ps5,你可以从gallery获得threadjob。https://powershellgallery.com/packages/ThreadJob/2.0.0或ps 7 https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/中的foreach-object -parallel
start-bittransfer?https://learn.microsoft.com/en-us/powershell/module/bitstransfer/start-bitstransfer?view=win10-ps

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

jchrr9hc5#

此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"
2skhul33

2skhul336#

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

相关问题