我花了几天时间尝试实现并行作业和队列系统,但是......我试过但我做不到。以下是没有实现任何内容的代码,以及来自外观的CSV示例。
我确信这篇文章可以帮助他们的项目中的其他用户。
每个用户都有自己的电脑,因此CSV文件如下所示:
pc1,user1
pc2,user2
pc800,user800
CODE:
#Source File:
$inputCSV = '~\desktop\report.csv'
$csv = import-csv $inputCSV -Header PCName, User
echo $csv #debug
#Output File:
$report = "~\desktop\output.csv"
#---------------------------------------------------------------
#Define search:
$findSize = 40GB
Write-Host "Lonking for $findSize GB sized Outlook files"
#count issues:
$issues = 0
#---------------------------------------------------------------
foreach($item in $csv){
if (Test-Connection -Quiet -count 1 -computer $($item.PCname)){
$w7path = "\\$($item.PCname)\c$\users\$($item.User)\appdata\Local\microsoft\outlook"
$xpPath = "\\$($item.PCname)\c$\Documents and Settings\$($item.User)\Local Settings\Application Data\Microsoft\Outlook"
if(Test-Path $W7path){
if(Get-ChildItem $w7path -Recurse -force -Include *.ost -ErrorAction "SilentlyContinue" | Where-Object {$_.Length -gt $findSize}){
$newLine = "{0},{1},{2}" -f $($item.PCname),$($item.User),$w7path
$newLine | add-content $report
$issues ++
Write-Host "Issue detected" #debug
}
}
elseif(Test-Path $xpPath){
if(Get-ChildItem $w7path -Recurse -force -Include *.ost -ErrorAction "SilentlyContinue" | Where-Object {$_.Length -gt $findSize}){
$newLine = "{0},{1},{2}" -f $($item.PCname),$($item.User),$xpPath
$newLine | add-content $report
$issues ++
Write-Host "Issue detected" #debug
}
}
else{
write-host "Error! - bad path"
}
}
else{
write-host "Error! - no ping"
}
}
Write-Host "All done! detected $issues issues"
答案 0 :(得分:1)
PowerShell中的并行数据处理并不是很简单,尤其是
排队。尝试使用已经完成的一些现有工具。
你可以看看模块
SplitPipeline。 cmdlet
Split-Pipeline
专为并行输入数据处理和支持而设计
排队输入(参见参数Load
)。例如,对于4个并行
每行10个输入项的管道,代码如下所示:
$csv | Split-Pipeline -Count 4 -Load 10, 10 {process{
<operate on input item $_>
}} | Out-File $outputReport
您所要做的就是实现代码<operate on input item $_>
。
并行处理和排队由此命令完成。
更新更新的问题代码。这是一些原型代码 备注。它们很重要。并行工作不一样 直接,有一些规则要遵循。
$csv | Split-Pipeline -Count 4 -Load 10, 10 -Variable findSize {process{
# Tips
# - Operate on input object $_, i.e $_.PCname and $_.User
# - Use imported variable $findSize
# - Do not use Write-Host, use (for now) Write-Warning
# - Do not count issues (for now). This is possible but make it working
# without this at first.
# - Do not write data to a file, from several parallel pipelines this
# is not so trivial, just output data, they will be piped further to
# the log file
...
}} | Set-Content $report
# output from all jobs is joined and written to the report file
更新:如何编写进度信息
SplitPipeline很好地处理了800个目标csv,太棒了。无论如何还有 让用户知道脚本是否还活着......?扫描一个大的csv可以采取 20分钟像“进行中25%”,“50%”,“75%”......
有几种选择。最简单的就是调用Split-Pipeline
开关-Verbose
。因此,您将获得有关进度的详细消息
看到剧本还活着。
另一个简单的选择是编写和查看来自作业的详细消息,
例如Write-Verbose ... -Verbose
即使是,也会写消息
在没有Split-Pipeline
的情况下调用Verbose
。
另一种选择是使用Write-Progress
的正确进度消息。
请参阅脚本:
Test-ProgressTotal.ps1
还显示了如何使用从作业更新的收集器
同时。您可以使用类似的技术来计算问题(
原始问题代码执行此操作)。全部完成后显示总数
向用户提出问题。