运行多个 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-ObjectForEach-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文件中,如

PowerShell:ConvertFrom-Json 将多个对象导出到 csv

从 Powershell 将不存在的文件路径导出到文本文件

从 CSV/TXT 创建文件夹并将匹配列移动到 Powershell 或 Batch 中的新目录