自定义对象到CSV PowerShell

时间:2014-09-02 17:26:50

标签: object powershell csv

  #Function to get the computerlist: Name,OS,IPv4, IPv6,DiskInfo
 function Get-ComputerListnDiskInfo{
 [CmdletBinding()]
  param(
  [Parameter(ValueFromPipeline=$True)] [string[]]$ComputerName 
  )
  BEGIN {
    Import-Module ActiveDirectory -Cmdlet Get-ADComputer -ErrorAction SilentlyContinue
  }
  PROCESS {

    try{
        $computerinfo = Get-ADComputer -Filter * -Properties OperatingSystem
        #Information about Name,Ipv4,IPv6,Device,VolumeName,Free,Busy,Size,Pfree,Pbusy for ALL COMPUTERS container
        $AllComputerInfo = @()
        foreach ($comp in $computerinfo){
            #Testing if computers is ON LINE
            $TestCon = Tester $comp.name
            $test = $TestCon.BooleanV
            if($test) {
                #write-output "$Test"
                $PhysicalDisks = Get-WMIObject -computername $comp.name -query "SELECT * from win32_logicaldisk where DriveType = 3" | Select Deviceid,VolumeName,FreeSpace,Size
                $Target = @()
                #Create the Object foreach disk and append in the Target Variable
                $GetOPNHealthStatus = Get-PhysicalDisk | select FriendlyName,OperationalStatus,HealthStatus

                Write-Output "$PhysicalDisk.count"

                #write-output $GetOPNHealthStatus.OperationalStatus
                $i=0
                foreach ($disk in $physicalDisks){

                    #Get all Items: size,free,busy,pfree and pbusy disk space info (can add a number at the end to set decimals)
                    $Size=FormatNSetSizeFreeSpace $disk.Size
                    $Free=FormatNSetSizeFreeSpace $disk.FreeSpace
                    $Busy=FormatNSetBusySpace $disk.Size $disk.FreeSpace
                    $Pfree=PercentFreeBusy $Free $size
                    $PBusy=PercentFreeBusy $Busy $size

                    #Create a new Object using all the info
                    $result =New-Object PSObject -Property @{
                        Device=$disk.DeviceID
                        VolumeName=$disk.VolumeName
                        Size=$Size
                        Free=$Free
                        Busy=$Busy
                        Pfree = $PFree
                        PBusy = $PBusy
                        OPStatus = $GetOPNHealthStatus.OperationalStatus[$i]
                        HStatus  = $GetOPNHealthStatus.HealthStatus[$i]
                    }

                    $i++
                    #add this info to the target array
                    $Target+= $result
                }


                    #Add all info into new object
                    $allIComnDiskInfo=New-Object PSObject -Property @{
                        Name = $comp.Name
                        OS = $comp.OperatingSystem
                        IPV4 =  $TestCon.IPv4
                        IPV6 =  $TestCon.IPv6
                        disksInfo = $Target
                    }
                #and Fill any just add this info to the $Allcomputer info (just online computer's)
                $AllComputerInfo+= $allIComnDiskInfo
            }   
        }
        return $AllComputerInfo
    }
    Catch{
        Write-Warning $_.Exception.Message
    }
  }
}

$test = Get-ComputerListnDiskInfo

运行$ test

$test = Get-ComputerListnDiskInfo

$测试

disksInfo : {@{PBusy=8,148; VolumeName=; Busy=10,306; Pfree=91,853; Free=116,178; Device=C:; Size=126,483; OPStatus=O; HStatus=H}}
Name      : DC2012
OS        : Windows Server 2012 R2 Standard
IPV4      : 192.168.1.251
IPV6      : fe80::cd63:76bf:3d2b:340f%12

正在运行

$test | Export-Csv here.csv

我明白了:

#TYPE System.String
"Length"
"6"

为什么会发生这种情况?

为什么我没有收到所有这些信息?

我应该如何搜索“diskInfo”变量

中包含的信息

我试图将这个$ test变量传递给另一个函数来格式化它,它似乎不起作用:

提前感谢您的答案

2 个答案:

答案 0 :(得分:1)

首先,您不仅要输出自定义对象或自定义对象数组。但这不是我看到的第一个问题。我看到的第一个问题是你有一个有参数的大函数,然后你这样做:

$test = Get-ComputerListnDiskInfo

所以你调用那个没有参数的函数,所以它没有计算机可以运行它。该功能的某些部分可能会默认为本地计算机,但它们都将完成吗?我不知道,也许。

那么$test实际上包含什么?数组。什么?好吧,函数输出的第一件事是字符串:

Write-Output "$PhysicalDisk.count"

因此,数组中的第一项是字符串。然后你构建了一堆自定义对象和数组,什么不是,你Return那些。很好,$test数组中的下一个项目是自定义对象。但$ test不是一个自定义对象数组,也不是一个自定义对象,它是一个包含各种内容的数组。

这就是Export-CSV不起作用的原因。

答案 1 :(得分:0)

基本上问题是这个问题: 我在使用CSV时输出中有一个system.object []。

object or similar output when using export-csv