#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变量传递给另一个函数来格式化它,它似乎不起作用:
提前感谢您的答案
答案 0 :(得分:1)
首先,您不仅要输出自定义对象或自定义对象数组。但这不是我看到的第一个问题。我看到的第一个问题是你有一个有参数的大函数,然后你这样做:
$test = Get-ComputerListnDiskInfo
所以你调用那个没有参数的函数,所以它没有计算机可以运行它。该功能的某些部分可能会默认为本地计算机,但它们都将完成吗?我不知道,也许。
那么$test
实际上包含什么?数组。什么?好吧,函数输出的第一件事是字符串:
Write-Output "$PhysicalDisk.count"
因此,数组中的第一项是字符串。然后你构建了一堆自定义对象和数组,什么不是,你Return
那些。很好,$test
数组中的下一个项目是自定义对象。但$ test不是一个自定义对象数组,也不是一个自定义对象,它是一个包含各种内容的数组。
这就是Export-CSV
不起作用的原因。
答案 1 :(得分:0)
基本上问题是这个问题: 我在使用CSV时输出中有一个system.object []。