PowerShell写入相同文件多个作业

时间:2014-04-27 19:17:43

标签: multithreading powershell

我有一个脚本可以从多个服务器上的文件中提取一行数据。我有一个单线程版本可以正常工作,但我想让它运行得更快。由于每个服务器只需要一行文件,我确信我可以并行运行。我从多个地方提取代码以运行多线程脚本,但是当我尝试将所有结果打印到一个输出文件时,没有打印任何内容。我想知道是否有人可以查看我的代码告诉我为什么这个相同的脚本,没有乔布斯工作正常,但在添加工作后,它没有。

$sb =  {
   Param($computer, $fileName, $outLog)
   net use "\\$computer\c$" **** /user:****
   if(test-path \\$computer\c$\sc\$fileName){
      [xml]$periods = Get-Content \\$computer\c$\sc\$fileName
      $endDate = $periods.PeriodDetail | select -last 1
      $output = "$computer;$endDate"
   }
   Else {
      $output = "$computer;$fileName Not Found"
   }
   #Synchronize file usage
   $mutex = new-object System.Threading.Mutex $false,'SomeUniqueName'
   $mutex.WaitOne() > $null
   #Write data to log
   Out-File -Append -InputObject $output -FilePath $outLog
   #Release file hold
   $mutex.ReleaseMutex()

   net use "\\$computer\c$" /de 
}

foreach($computer in $computerName){
   while ((Get-Job -State Running).Count -ge 20) {
      Start-Sleep -Seconds 5;
   }
   Start-Job -Scriptblock $sb -ArgumentList $computer,$fileName,$outLog
}
Get-Job | Wait-Job | Receive-Job

1 个答案:

答案 0 :(得分:2)

感谢您的帮助。以下是生成的代码:

$sb =  {
   Param($computer, $fileName, $outLog)
   net use "\\$computer\c$" $password /user:$userName | Out-Null
   if(test-path \\$computer\c$\sc\$fileName){
      [xml]$periods = Get-Content \\$computer\c$\sc\$fileName
      $endDate = $periods.IndataDbf.ingredient.PeriodDetail.PeriodEndDate | select -last 1
         $output = "$computer;$endDate"
      }
   Else {
      $output = "$computer;$fileName Not Found"
   }
   Write-Output -InputObject $output
   net use "\\$computer\c$" /de | Out-Null
}

foreach($computer in $computerName){
   while ((Get-Job -State Running).Count -ge 20) {
      Start-Sleep -Seconds 5;
   }
   Start-Job -Scriptblock $sb -ArgumentList $computer,$fileName,$outLog
}
Get-Job | Wait-Job | Receive-Job | Out-File -Append -FilePath $outLog

我正在考虑在Get-Job之前做另一个Start-Job,只获取包含更多数据的作业,但我还没有测试过。