如何在文件中存储数组的输出?

时间:2015-11-30 11:41:28

标签: powershell scripting powershell-v2.0 powershell-v3.0 powershell-v4.0

我有一个小的PowerShell脚本,可以远程从服务器收集指标。 通常,调用函数来收集CPU /内存/ HDD信息。

我从文本文件和foreach机器中获取服务器,调用这些函数。

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输出所有内容但当然每个新输入都覆盖了我的文件。 有没有办法临时存储输出并以良好的方式将其输出?

你会推荐什么?也许还有一种更顺畅的方式呢?

2 个答案:

答案 0 :(得分:1)

输出文件的用途是什么?如果它是供人类消费的话,那么CSV可能是你最好的选择,因为它易于导入Excel。如果它是准确表示对象,那么XML是一个更好的主意。每种类型都有自己的导出cmdlet:Export-CsvExport-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

答案 1 :(得分:0)

虽然问题看起来像覆盖而不是附加,但您可以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()不同,你得到的只是一个名字。文件创建取决于您。