所以我有這個簡單的腳本,它允許我在不同的檔案夾中復制和粘貼專案,同時在 Windows Powershell 中更改它們的名稱。
$destfolder = '.\destfolder\'
get-childitem -Recurse -File .\srcfolder\ | Foreach-Object {
$newname = $_.name
$newname = $_.directory.parent.name '-' $_.directory.name '-' $_.name
Copy-Item -Path $_.FullName -Destination (Join-Path $destfolder $newname) -Verbose
}
我想知道如何添加多執行緒/并行處理以使其更快。也許還有robocopy。
我嘗試使用物件并行功能,但沒有奏效。
-我檢查了一下,似乎 Foreach-Object -Parallel 不起作用的原因是因為我正在運行 powershell 版本 5.1.22621.608
-我想一次將檔案夾中多個子目錄中的檔案復制到沒有目錄的單個檔案夾中,但是 robocopy 不允許這樣做
uj5u.com熱心網友回復:
首先,即使在單個執行緒中,您也可以通過直接管道與延遲系結腳本塊組合來加速您的命令:Copy-Item
$destfolder = '.\destfolder\'
Get-ChildItem -Recurse -File .\srcfolder\ |
Copy-Item -Destination {
Join-Path $destfolder ($_.directory.parent.name, $_.directory.name, $_.name -join '-')
} -Verbose -WhatIf
注意:上面命令中的-WhatIf
常用引數是預覽操作。-WhatIf
一旦您確定該操作將執行您想要的操作,請洗掉。
至于并行性:
Windows PowerShell(與PowerShell (Core) 7 相對)僅內置基于子行程Start-Job
的并行性 via ,這既耗費資源又緩慢。
但是,作為模塊一部分的按需安裝第三方Invoke-Parallel
功能提供了基于執行緒的并行性和管道支持,類似于PowerShell (Core) 7 。PSParallelPipeline
ForEach-Object -Parallel
您必須自己測驗它的使用是否會在您的情況下帶來任何性能改進,但這是您呼叫它的方式:
首先,安裝模塊:
# Install the module that has the Invoke-Parallel function.
# (Only needed once).
Install-Module PSParallelPipeline -Scope CurrentUser
然后用于Invoke-Parallel
并行處理最多 5 個輸入檔案(您可以使用 修改此數字-ThrottleLimit
):
$destfolder = '.\destfolder\'
Get-ChildItem -Recurse -File .\srcfolder\ |
Invoke-Parallel {
$_ | Copy-Item -Destination (
Join-Path $using:destfolder ($_.directory.parent.name, $_.directory.name, $_.name -join '-')
) -Verbose -WhatIf
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526209.html
標籤:多线程电源外壳复制粘贴
下一篇:顫振展開/折疊具有動態高度的容器