我试图解压一吨使用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 *
当我运行这个没有多线程的代码,它工作正常,但它没有文件实际上得到解压缩。 为什么是这样?
不知道如果你的样品是复制粘贴或没有,但你的参数是$ destinationDir但你参考$目的地,然后使用$目的地创建$ destinationDir。 我假设这是一个错字。 我固定的功能和它的作品如你所愿。
$unzip = {
param([string]$sourceFile, [string]$destination)
#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())
}
使用接收作业会显示你指点你在正确的方向以下错误:
Cannot bind argument to parameter 'Path' because it is null.
+ CategoryInfo : InvalidData: (:) [mkdir], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,mkdir
+ PSComputerName : localhost
Method invocation failed because [System.String] doesn't contain a method named 'copyhere'.
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
+ PSComputerName : localhost
我仍建议移动从comobject离开shell.application和可能的话但是,使用System.IO.Compression .NET解决方案。 还要注意的是PowerShell的工作有5个同时运行的作业的硬工资帽。 我不知道这是固定在V5与否。 饼干怪兽写了一个极好的职位和功能使用基于了一些运行空间京东方的Prox工作作为处理的并发性能得到改善的较好方法。