json - Start-Job 将结果保存到 CSV
问题描述
我有以下 PowerShell (v5) 代码,我想将作业结果写入文件。在第一行我想要标题,在下一行我只想要结果。
$siteToCheck = "google.com","stackoverflow.com","codeoverflow.com"
$alljobs = $true
$fistLine = $true
function AsyncJobs([array]$siteADDRs) {
$sb = {
Param($site)
$baseSite = 'https://api.ssllabs.com/api/v3/analyze?host='
$siteParams = '&publish=off'
$fullSite = [String]::Format("{0}{1}{2}", $baseSite, $site, $siteParams)
$results = Invoke-WebRequest -Uri $fullSite | ConvertFrom-Json
while ($results.status -ne "READY" -and $results.status -ne "ERROR" ) {
sleep 30
$results = Invoke-WebRequest -Uri $fullSite | ConvertFrom-Json
}
(($results | select endpoints).endpoints) |
ft @{Label="Site_Address"; exp={$site}}, grade, ipAddress
}
foreach ($site in $siteADDRs) {
Start-Job -Name $site -ScriptBlock $sb -ArgumentList $site | Out-Null
}
}
AsyncJobs -siteADDR $siteToCheck
while ($alljobs -eq $true) {
$ourJobs = Get-Job
foreach ($job in $ourJobs) {
$jobResults = $null
switch ($job.State) {
{$_ -eq 'Running'} {
Write-Host $job.Name " is still in runing sate"
}
{$_ -eq 'Completed'} {
$jobResults = Receive-Job -Id $job.Id
if ($fistLine -eq $true) {
($jobResults | Out-String)
$fistLine = $false
} else {
$tmpR = ($jobResults | Out-String)
}
Remove-Job -Id $job.Id
}
{$_ -eq 'Failed'} {}
}
}
$ourJobs = $null
$ourJobs = Get-Job
if ($ourJobs) {
$alljobs = $true
} else {
$alljobs = $false
}
Start-Sleep -Seconds 10
}
解决方案
在您的脚本块更改中
(($results | select endpoints).endpoints) |
ft @{Label="Site_Address"; exp={$site}}, grade, ipAddress
至
$results | Select-Object -Expand endpoints |
Select-Object @{Label="Site_Address"; exp={$site}}, grade, ipAddress
这样您就可以将输出作为自定义对象而不是Format-Table
生成的格式化对象。每当需要进一步处理数据时,通常应避免使用Format-*
cmdlet。cmdlet 仅在直接向用户显示数据时才有用。
像这样导出已完成作业的数据:
while (Get-Job -State 'Running') {
$jobs = Get-Job -State 'Completed'
$jobs | Receive-Job | Export-Csv 'output.csv' -NoType -Append
$jobs | Remove-Job
Start-Sleep -Milliseconds 200
}
循环完成后,对剩余的已完成作业进行最终导出,然后报告并删除失败的作业:
$jobs = Get-Job -State 'Completed'
$jobs | Receive-Job | Export-Csv 'output.csv' -NoType -Append
$jobs | Remove-Job
Get-Job
Get-Job | Remove-Job
推荐阅读
- php - 为什么product表和product_supplier表中都有id_supplier?
- php - 将 laravel 项目部署到 Cpanel 时如何解决错误 404?
- php - CI上的“解析错误”的PHPunit测试错误
- python - 如何调用没有括号`()`的类方法?
- python - Python pandas替换字符串内特定位置的字符串
- neo4j - Neo4J Unicity 奇迹:单例或聚合问题
- typescript - 使用打字稿中的验证将字符串转换为 const 枚举
- c# - AspNetUsers 与具有更多用户(员工)信息的另一个表的一对一关系
- c++ - 如何将 C++ 程序的编译逻辑与文件头数据的其余部分隔离开来?
- ios - UICollectionViewCompositionalLayout 项目大小不正确