在将阵列导出到CSV文件中时出现问题 [英] Issue in export Array to CSV file

查看:96
本文介绍了在将阵列导出到CSV文件中时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在文本文件中有计算机列表,我正在尝试获取物理驱动器,操作系统体系结构和物理内存的详细信息.在Matt(SO用户)的帮助下,这是powershell脚本.

I have list of machine in text file and I am trying to get the details of physical drives, OS architecture and physical memory. With the help of Matt (SO user) here is the powershell script.

$server = Get-Content .\Server.txt
#$infoObject11 = @{}
$infoObject11 = @{}
foreach ($server in $servers) {
    # Gather all wmi drives query at once
    $alldisksInfo = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive" -ComputerName $server -ErrorAction SilentlyContinue | Group-Object __Server

    # Figure out the maximum number of disks
    $MaximumDrives = $alldisksInfo | Measure-Object -Property Count -Maximum | Select-Object -ExpandProperty Maximum

    # Build the objects, making empty properties for the drives that dont exist for each server where need be. 
    $server | ForEach-Object {
        # Clean the hashtable
        $infoObject1 = @{}
        # Populate Server
        $infoObject1.Server = $server 
        $HOSTNAME = Get-WMIObject -Query "Select * from Win32_OperatingSystem" -ComputerName $infoObject1.Server
        # Add other simple properties here
        $infoObject1.PhysicalMemory = (Get-WmiObject Win32_PhysicalMemory -ComputerName $infoObject1.Server | Measure-Object Capacity -Sum).Sum/1gb
        $infoObject1.OSarchitecture =$HOSTNAME.osarchitecture

        # Add the disks information from the $diskInfo Array
        $serverDisksWMI = $alldisksInfo | Where-Object{$_.Name -eq $infoObject1.Server} | Select-Object -ExpandProperty Group

        for ($diskIndex =0; $diskIndex -lt $MaximumDrives;$diskIndex++) {
            $infoObject1."PhysicalDisk$diskIndex" = [Math]::Round(($serverDisksWMI | Where-Object{($_.DeviceID -replace "^\D*") -eq $diskIndex} | Select -Expand Size)/1GB)
        }


    }
    # Create the custom object now.
    New-Object -TypeName psobject -Property $infoObject1  | Export-Csv -path .\Server_Inventory_$((Get-Date).ToString('MM-dd-yyyy')).csv -NoTypeInformation 
}

问题在CSV文件中,我正在获取单台计算机的详细信息,但是在server.txt文件中,有一台以上的计算机.如果在New-Object之前打印$infoObject1,则可以看到多台计算机的详细信息.数组似乎有问题,我无法将其导出为CSV.

Problem is in the CSV file I am getting single machine details but in server.txt file there are more than 1 machine. If I print $infoObject1 before New-Object then I can see there are details of multiple machine. It seems like some issue with array and I am not able to export it in CSV.

有人可以提出建议吗?

推荐答案

您似乎在集成我的代码时遇到问题.您添加了不应存在的第二个循环.同样,正如其他用户指出的那样,您不是在循环的外部中创建每个服务器对象. 答案(源于您的代码的来源)的那部分正确.我什至告诉你Export-CSV放在哪里.

It looks like you are having issues integrating my code. You have added a second loop that should not be there. Also as other users pointed out you are not creating the per server object outside the loop. The answer, from where your code comes from, has that part correct. I had even showed you where to put the Export-CSV.

$servers = Get-Content .\Server.txt

# Gather all wmi drives query at once
$alldisksInfo = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive" -ComputerName $servers -ErrorAction SilentlyContinue | Group-Object __Server

# Figure out the maximum number of disks
$MaximumDrives = $alldisksInfo | Measure-Object -Property Count -Maximum | Select-Object -ExpandProperty Maximum

# Build the objects, making empty properties for the drives that dont exist for each server where need be. 
$servers | ForEach-Object {
    # Clean the hashtable
    $infoObject1 = @{}
    # Populate Server
    $infoObject1.Server = $_ 
    # Add other simple properties here
    $infoObject1.PhysicalMemory = (Get-WmiObject Win32_PhysicalMemory -ComputerName $infoObject1.Server | Measure-Object Capacity -Sum | Select-Object -ExpandProperty Sum)/1GB
    $infoObject1.OSarchitecture = Get-WMIObject -Query "Select * from Win32_OperatingSystem" -ComputerName $infoObject1.Server | Select-Object -ExpandProperty OSArchitecture

    # Add the disks information from the $diskInfo Array
    $serverDisksWMI = $alldisksInfo | Where-Object{$_.Name -eq $infoObject1.Server} | Select-Object -ExpandProperty Group

    for ($diskIndex =0; $diskIndex -lt $MaximumDrives;$diskIndex++) {
        $infoObject1."PhysicalDisk$diskIndex" = [Math]::Round(($serverDisksWMI | Where-Object{($_.DeviceID -replace "^\D*") -eq $diskIndex} | Select-Object -ExpandProperty Size)/1GB)
    }

    # Create the custom object now for this pass in the loop.
    New-Object -TypeName psobject -Property $infoObject1  
} | Export-Csv -path .\Server_Inventory_$((Get-Date).ToString('MM-dd-yyyy')).csv -NoTypeInformation 

这篇关于在将阵列导出到CSV文件中时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆