运行多个PowerShell命令并将结果导出到CSV

zphenhs4  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(224)

我希望这是个不错的速战速决。我设置了11个脚本来检查是否直接分配了Microsoft许可证。然后,我有一个master.ps1,它将一个接一个地运行所有这些脚本。我想要实现的基本上是在master.ps1运行结束后从它导出结果。所有脚本都是相同的,唯一的区别是许可证名称发生了变化。例如,检查EMS许可证:

$skuId = "contoso:SPE_E3"
`Get-MsolUser -All | where {$_.isLicensed -eq $true -and $_.Licenses.AccountSKUID -eq $skuId} | select UserPrincipalName,
@{Name="SkuId";Expression={$skuId}}, 
@{Name="AssignedDirectly";Expression={(UserHasLicenseAssignedDirectly $_ $skuId)}}, 
@{Name="AssignedFromGroup";Expression={(UserHasLicenseAssignedFromGroup $_ $skuId)}}`

Master.ps1将如下所示:

&"$PSScriptroot\Script1.ps1"
&"$PSScriptroot\Script2.ps1"
&"$PSScriptroot\Script3.ps1"


我试着在主文件后添加了Export-CSV,但不起作用,有人能帮忙吗?

z9ju0rcb

z9ju0rcb1#

以下是使用ForEach-Object管道的方法:

'Script1', 'Script2', 'Script3' | ForEach-Object {
    & "$PSScriptroot\$_.ps1"
} | Export-Csv ...

这会将包含脚本名的数组文字传递给ForEach-Object。然后将ForEach-Object脚本块的输出传递给Export-Csv因为它是生成的(流方法)。
如果您希望保留单独的脚本调用(如果脚本需要不同的参数,这可能会更直接),您可以只创建一个脚本块{},并使用&操作符立即运行它:

& {
    & "$PSScriptroot\Script1.ps1"
    & "$PSScriptroot\Script2.ps1"
    & "$PSScriptroot\Script3.ps1"
} | Export-Csv ...

这与上面的ForEach-Object变体具有相同的优势,即它是一种方法,需要更少的内存来存储中间输出(仅用于内部缓冲,与脚本输出大小无关)。

gdrx4gfi

gdrx4gfi2#

确保在导出到CSV时捕获所有脚本的输出:

@(
  & "$PSScriptroot\Script1.ps1"
  & "$PSScriptroot\Script2.ps1"
  & "$PSScriptroot\Script3.ps1"
) |Export-Csv ...

或者,逐个导出每个脚本的输出,然后对后续脚本使用Export-Csv -Append

& "$PSScriptroot\Script1.ps1" |Export-Csv ...
& "$PSScriptroot\Script2.ps1" |Export-Csv -Append ...
& "$PSScriptroot\Script3.ps1" |Export-Csv -Append ...

相关问题