批量运行PowerShell Microsoft许可证检查脚本后导出CSV问题咨询
问题原因
你直接在master.ps1末尾加Export-CSV不生效的核心原因是:子脚本运行产生的结果直接输出到了控制台,没有被捕获存储,Export-CSV无法接收到需要导出的输入内容。
适配现有脚本结构的解决方案
修改master.ps1,先将所有子脚本的执行结果统一收集到数组变量中,最后再统一导出即可,示例代码如下:
# 初始化空数组存储所有许可证检查结果 $allCheckResults = @() # 依次执行子脚本并收集返回结果 $allCheckResults += & "$PSScriptroot\Script1.ps1" $allCheckResults += & "$PSScriptroot\Script2.ps1" $allCheckResults += & "$PSScriptroot\Script3.ps1" # 按规则补全剩余8个脚本的调用代码 # 所有脚本执行完成后统一导出为CSV $allCheckResults | Export-Csv -Path "$PSScriptroot\LicenseCheckResult.csv" -NoTypeInformation -Encoding UTF8
如果不想逐个写11个脚本的调用语句,也可以批量遍历匹配命名规则的子脚本:
$allCheckResults = @() # 按名称排序后批量执行所有Script开头的ps1脚本 Get-ChildItem -Path $PSScriptroot -Filter "Script*.ps1" | Sort-Object Name | ForEach-Object { $allCheckResults += & $_.FullName } $allCheckResults | Export-Csv -Path "$PSScriptroot\LicenseCheckResult.csv" -NoTypeInformation -Encoding UTF8
优化建议(可选)
由于11个子脚本仅skuId参数不同,完全可以合并为一个脚本减少冗余代码,无需维护多个子脚本,示例实现如下:
# 填入所有需要检查的许可证SkuId $targetSkuIds = @( "contoso:SPE_E3", "contoso:EMS" # 补充剩余许可证ID ) $allCheckResults = @() foreach ($skuId in $targetSkuIds) { $allCheckResults += Get-MsolUser -All | Where-Object {$_.isLicensed -eq $true -and $_.Licenses.AccountSKUID -eq $skuId} | Select-Object UserPrincipalName, @{Name="SkuId";Expression={$skuId}}, @{Name="AssignedDirectly";Expression={(UserHasLicenseAssignedDirectly $_ $skuId)}}, @{Name="AssignedFromGroup";Expression={(UserHasLicenseAssignedFromGroup $_ $skuId)}} } $allCheckResults | Export-Csv -Path "$PSScriptroot\LicenseCheckResult.csv" -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者Admaine
相关产品推荐
相关产品推荐

