从Powershell foreach循环中将输出安排到CSV

时间:2016-03-23 18:38:27

标签: csv powershell foreach

我正在写一个执行foreach循环的powershell函数。循环遍历主机的文本文件列表中的每个服务器名称,然后为每个服务器名称拉取C上的可用空间,然后将其分配给变量。

然后另一个循环再次遍历列表并获取主机的名称,然后将其添加到变量中。

然后我有一个变量,它接受包含从循环中提取的数据的两个变量并将其导出为CSV。它将正确的数据放入CSV中,但我想以某种方式对其进行格式化。当前的csv输出是(例如4个条目)'服务器1''服务器2''服务器3''服务器4''diskspacevalue1''2''3''4'等。

所以我在我需要的所有数据的位置,但我需要安排它,以便一个单元格具有服务器名称,然后它旁边的单元格具有相应的值。

我有一种感觉,我应该创建对象或使用数组但是想知道是否有任何我可以添加的东西来实现我想要的格式,基于我到目前为止所编写的脚本?

function diskcheck {
    $freespace = Get-Content C:\temp2\DiskspaceProj\hosts.txt | Foreach-Object {
        Get-WmiObject win32_logicaldisk -Computername $_ -Filter "DeviceID='C:'" | select -ExpandProperty "FreeSpace"
    }
    $hostName = Get-Content C:\temp2\DiskspaceProj\hosts.txt | Foreach-Object {
        Get-WmiObject Win32_ComputerSystem -ComputerName $_ | Select -ExpandProperty "Name"
    }
    $output = "$hostname, $freespace" | echo > C:\temp2\DiskspaceProj\diskspace.csv
}
diskcheck

1 个答案:

答案 0 :(得分:3)

不要维护两个单独的数组 - 创建包含这两个属性的一个对象数组:

function diskcheck 
{
    param(
        [string]$Path = 'C:\temp2\DiskspaceProj\hosts.txt'
    )

    Get-Content $Path |ForEach-Object {
        New-Object psobject -Property @{
            Hostname = Get-WmiObject Win32_ComputerSystem -ComputerName $_ |Select -ExpandProperty Name
            FreeSpace = Get-WmiObject win32_logicaldisk -Computername $_ -Filter "DeviceID='C:'" | select -ExpandProperty FreeSpace
        }
    }
}

然后使用Export-CSV将列表导出到文件中:

diskcheck |Select Hostname,FreeSpace |Export-Csv C:\diskspace_output.csv -NoTypeInformation