我有一个小的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
输出所有内容但当然每个新输入都覆盖了我的文件。
有没有办法临时存储输出并以良好的方式将其输出?
你会推荐什么?也许还有一种更顺畅的方式呢?
答案 0 :(得分:1)
输出文件的用途是什么?如果它是供人类消费的话,那么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
答案 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()
不同,你得到的只是一个名字。文件创建取决于您。