【问题标题】:Arranging output to CSV from Powershell foreach loop从 Powershell foreach 循环安排输出到 CSV
【发布时间】:2016-07-11 05:13:22
【问题描述】:

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

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

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

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

我觉得我应该创建对象或使用数组,但想知道是否可以根据我目前编写的脚本添加任何内容来实现我想要的格式?

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

【问题讨论】:

    标签: csv powershell foreach


    【解决方案1】:

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

    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
    

    【讨论】:

    • 运行良好。但是我在 CSV 中得到了一个奇怪的输出。这些值在每个单元格中显示为“System.Object[]”。有什么想法吗?
    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    相关资源
    最近更新 更多