【发布时间】:2015-02-13 22:14:10
【问题描述】:
我正在尝试使用 PowerShell 解压缩大量文件。我认为这是一个并行化的好地方。但是,我的并行化尝试似乎使解压缩无效,即使它在单线程模式下工作。
$unzip = {
param([string]$sourceFile, [string]$destinationDir)
#Clean out the destination if it exists
rmdir $destination -Force -Recurse -ErrorAction SilentlyContinue
mkdir $destination -Force
#Actual unzip
$shell = new-object -com shell.application
$zipFile = $shell.NameSpace($sourceFile)
$destinationDir = $shell.NameSpace($destination)
$destinationDir.copyhere($zipFile.items())
}
foreach($file in $files){
$args = ($file.FullName, $destinationDir)
Start-Job $unzip -ArgumentList $args
}
#Cleanup
While (Get-Job -State "Running") { Start-Sleep 2 }
Remove-Job *
当我在没有多线程代码的情况下运行它时,它可以正常工作,但实际上没有任何文件被解压缩。这是为什么呢?
【问题讨论】:
-
这可能会在SuperUser 上得到更好的答案。
-
使用多线程不太可能显着提高性能。通常,解压缩非常快,但将解压缩的数据写入磁盘驱动器非常慢。而且由于磁盘驱动器一次只能做一件事,因此您的线程大部分时间都在等待磁盘驱动器可用。你最好只做单线程。
-
@JimMischel 是的,但我已经这样做了。我想我可能会挑战自己并让它成为多线程的,但我不知道如何让它工作。
-
那么 $destinationDir 在您的代码中的哪个位置被分配?你在哪里调用receive-job来查看是否有错误或其他输出?那些只是不在示例中,还是完全没有?
-
$destinationDir在示例之外被分配。它非常简单,我知道它可以工作,因为它在单线程运行时没有问题。而且我不打电话给receive-job,因为我并不真正关心输出。
标签: multithreading powershell unzip