运行多个 Powershell 命令并将结果导出到 csv
Posted
技术标签:
【中文标题】运行多个 Powershell 命令并将结果导出到 csv【英文标题】:Run multiple Powershell commands and export results to csv 【发布时间】:2022-01-03 18:29:27 【问题描述】:我希望这是一个不错的快速解决方案。我设置了 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,但它不起作用,有人可以帮忙吗?
非常感谢,
一个
【问题讨论】:
【参考方案1】:确保在导出为 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 ...
【讨论】:
请注意,@( ... )
首先将所有输出收集到内存中的数组中,然后将整个数组通过管道传输到Export-Csv
。使用像& ... |Export-Csv ...
这样的流式处理方法将使用更少的内存资源,因为每个脚本输出都会在生成时传递给Export-Csv
。
这正是我所追求的,谢谢 :)【参考方案2】:
这是一种使用ForEach-Object
管道的方法:
'Script1', 'Script2', 'Script3' | ForEach-Object
& "$PSScriptroot\$_.ps1"
| Export-Csv ...
这会将包含脚本名称的数组文字传递给ForEach-Object
。 ForEach-Object
脚本块的输出随后被传递给Export-Csv
,在生成时(一种流式方法)。
如果您想保留单独的脚本调用(如果脚本需要不同的参数,这可能更直接),您可以只创建一个脚本块 并立即运行它,使用
&
operator:
&
& "$PSScriptroot\Script1.ps1"
& "$PSScriptroot\Script2.ps1"
& "$PSScriptroot\Script3.ps1"
| Export-Csv ...
这与上面的ForEach-Object
变体具有相同的优点,它是一种流式处理 方法,需要更少的内存来存储中间输出(仅用于内部缓冲,与脚本输出大小无关) .
【讨论】:
以上是关于运行多个 Powershell 命令并将结果导出到 csv的主要内容,如果未能解决你的问题,请参考以下文章
powershell PowerShell函数运行JavaScript / JQuery并将结果返回PS,超时
如何从 Big Query cli 运行保存的查询并将结果导出到 CSV?
一个bat文件同时启动多个cmd窗口,并且每个窗口都运行tracert命令,并将结果重定向到各自的txt文件中,如