在不使用任何第三方软件的情况下通过 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
问题陈述: 我正在尝试将 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