如何将数组的输出存储在文件中?
How to store output of an array in a file?
我有一个小的 powershell 脚本,可以从远程服务器收集指标。
通常调用函数来收集 CPU / 内存 / HDD 信息。
我从一个文本文件中获取服务器,并为每台机器调用函数。
foreach ($i in Get-Content "C:\Servers.txt")
{{"=========================="; $i + "`n" + "==========================";
"Number of CPU Cores" ; CPU-Info ; "Memory in GB" ; Memory-Info
; "HDDs in GB" ; HDD-Size }
首先,我尝试使用 out-file
输出所有内容,但当然每个新输入都会覆盖我的文件。
有没有办法临时存储输出并以一种好的方式将其输出文件?
你会推荐什么?也许有更流畅的方法?
虽然问题看起来像是覆盖而不是追加,但您可以ask .Net to provide you 唯一一个临时文件。该方法是 io.path.GetTempFileName()
并且它也创建一个新的零字节文件。像这样,
$tempFile = [io.path]::GetTempFileName()
test-path $tempFile
True
$tempFile
C:\Users\myhomedir\AppData\Local\Temp\tmpDA2E.tmp
还有另一种方法,io.path.GetRandomFileName()
可以为您提供一个 cryptographically strong 随机文件名。不像 GetTempFileName()
,你得到的只是一个名字。文件创建由您决定。
输出文件的用途是什么?如果它供人类使用,那么 CSV 可能是您最好的选择,因为它可以轻松导入 Excel。如果它是为了准确表示对象,那么 XML 是一个更好的主意。这些类型中的每一种都有自己的导出 cmdlet:分别为 Export-Csv
和 Export-Clixml
。
在使用其中一个 cmdlet 一次性导出所有数据之前,将所有输出添加到一个数组可能是更好的方法。我通常通过为循环的每个 运行 创建一个自定义对象来做这种事情:
$OutputFile = 'C:\Output.csv'
$ServerList = Get-Content 'C:\Servers.txt'
$OutputArray = @()
foreach ($i in $ServerList)
{
$ServerObject = New-Object PSObject
Add-Member -InputObject $ServerObject -MemberType NoteProperty -Name 'CPU_Cores' -Value (CPU-Info $i)
Add-Member -InputObject $ServerObject -MemberType NoteProperty -Name 'Memory_GB' -Value (Memory-Info $i)
Add-Member -InputObject $ServerObject -MemberType NoteProperty -Name 'HDD_Size' -Value (HDD-Size $i)
$OutputArray += $ServerObject
}
$OutputArray | Export-Csv -Path $OutputFile
我有一个小的 powershell 脚本,可以从远程服务器收集指标。 通常调用函数来收集 CPU / 内存 / HDD 信息。
我从一个文本文件中获取服务器,并为每台机器调用函数。
foreach ($i in Get-Content "C:\Servers.txt")
{{"=========================="; $i + "`n" + "==========================";
"Number of CPU Cores" ; CPU-Info ; "Memory in GB" ; Memory-Info
; "HDDs in GB" ; HDD-Size }
首先,我尝试使用 out-file
输出所有内容,但当然每个新输入都会覆盖我的文件。
有没有办法临时存储输出并以一种好的方式将其输出文件?
你会推荐什么?也许有更流畅的方法?
虽然问题看起来像是覆盖而不是追加,但您可以ask .Net to provide you 唯一一个临时文件。该方法是 io.path.GetTempFileName()
并且它也创建一个新的零字节文件。像这样,
$tempFile = [io.path]::GetTempFileName()
test-path $tempFile
True
$tempFile
C:\Users\myhomedir\AppData\Local\Temp\tmpDA2E.tmp
还有另一种方法,io.path.GetRandomFileName()
可以为您提供一个 cryptographically strong 随机文件名。不像 GetTempFileName()
,你得到的只是一个名字。文件创建由您决定。
输出文件的用途是什么?如果它供人类使用,那么 CSV 可能是您最好的选择,因为它可以轻松导入 Excel。如果它是为了准确表示对象,那么 XML 是一个更好的主意。这些类型中的每一种都有自己的导出 cmdlet:分别为 Export-Csv
和 Export-Clixml
。
在使用其中一个 cmdlet 一次性导出所有数据之前,将所有输出添加到一个数组可能是更好的方法。我通常通过为循环的每个 运行 创建一个自定义对象来做这种事情:
$OutputFile = 'C:\Output.csv'
$ServerList = Get-Content 'C:\Servers.txt'
$OutputArray = @()
foreach ($i in $ServerList)
{
$ServerObject = New-Object PSObject
Add-Member -InputObject $ServerObject -MemberType NoteProperty -Name 'CPU_Cores' -Value (CPU-Info $i)
Add-Member -InputObject $ServerObject -MemberType NoteProperty -Name 'Memory_GB' -Value (Memory-Info $i)
Add-Member -InputObject $ServerObject -MemberType NoteProperty -Name 'HDD_Size' -Value (HDD-Size $i)
$OutputArray += $ServerObject
}
$OutputArray | Export-Csv -Path $OutputFile