在嵌套的 PSObject 上重载 ToString 问题 属性
Issues Overloading ToString on Nested PSObject Property
我已经创建了一个具有多种属性的自定义 PSObject,我正在尝试为其中的一些属性重载 ToString。我已经成功使用了 TimeSpan 属性之一,但没有成功使用 WMI 对象。
# Get WMI info
$wmiOS = Get-WmiObject -Class Win32_OperatingSystem
$wmiSystem = Get-WmiObject -Class Win32_ComputerSystem
$wmiDrives = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType='3'"
$ipv4Address = (Test-Connection -ComputerName $env:COMPUTERNAME -Count 1).IPV4Address.IPAddressToString
$uptime = (Get-Date) - ($wmiOS.ConvertToDateTime($wmiOS.LastBootUpTime))
# Setup object
$result = New-Object -TypeName psobject -Property @{
Hostname = $($wmiSystem.Name)
Domain = $($wmiSystem.Domain)
Username = $($wmiSystem.Username)
OperatingSystem = $($wmiOS.Caption)
OSArchitecture = $($wmiOS.OSArchitecture)
PSVersion = "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)"
IPv4Address = $ipv4Address
Uptime = $uptime
DriveInfo = $wmiDrives
}
# Overload DriveInfo ToString
$result.DriveInfo = $result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {
"$($this.DeviceID) $($this.FreeSpace) GB;"
} -Force -PassThru
# Overload Uptime ToString
$result.Uptime = $result.Uptime | Add-Member -MemberType ScriptMethod -Name ToString -Value {
"$($this.Days) days, $($this.Hours) hours, $($this.Minutes) minutes, $($this.Seconds) seconds"
} -Force -PassThru
# Overload result ToString
$result = $result | Add-Member -MemberType ScriptMethod -Name ToString -Value {
$temp = @"
Hostname: $($this.Hostname)
Domain: $($this.Domain)
Console User: $($this.Username)
Operating System: $($this.OperatingSystem)
OS Architecture: $($this.OSArchitecture)
PS Version: $($this.PSVersion)
IPv4 Address: $($this.IPv4Address)
Uptime: $($this.Uptime.ToString())
Free Space: $($this.DriveInfo)
"@
$temp
} -Force -PassThru
似乎一切正常,但 DriveInfo 过载。我只是从中得到 "System.Object[]" 作为 return。令我感到奇怪的是,当我执行 $result.ToString() 时,我得到以下信息(参见 "Free Space"):
Domain: domain.local
Console User: domain\username
Operating System: Microsoft Windows 10 Pro
OS Architecture: 64-bit
PS Version: 5.1
IPv4 Address: 1.1.1.1
Uptime: 2 days, 1 hours, 31 minutes, 49 seconds
Free Space: C: 58721181696; E: 631496687616;
$result.Uptime.ToString():
2 days, 1 hours, 19 minutes, 34 seconds
$result.DriveInfo.ToString():
System.Object[]
我可能遗漏了一些明显的东西,但此时我迷路了。感谢您提前提供的任何帮助!
你能不能试试替换一下:
$result.DriveInfo = $result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {"$($this.DeviceID) $($this.FreeSpace) GB;"} -Force -PassThru
由
$result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {"$($this.DeviceID) $($this.FreeSpace) GB;"} -Force -PassThru
根据我的理解,Add-Member
应用于每个驱动器,您不需要影响结果,因为您更改了列表中的每个对象。之后您可以使用 :
进行测试
$n = 0
$result.DriveInfo[$n].ToString()
我已经创建了一个具有多种属性的自定义 PSObject,我正在尝试为其中的一些属性重载 ToString。我已经成功使用了 TimeSpan 属性之一,但没有成功使用 WMI 对象。
# Get WMI info
$wmiOS = Get-WmiObject -Class Win32_OperatingSystem
$wmiSystem = Get-WmiObject -Class Win32_ComputerSystem
$wmiDrives = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType='3'"
$ipv4Address = (Test-Connection -ComputerName $env:COMPUTERNAME -Count 1).IPV4Address.IPAddressToString
$uptime = (Get-Date) - ($wmiOS.ConvertToDateTime($wmiOS.LastBootUpTime))
# Setup object
$result = New-Object -TypeName psobject -Property @{
Hostname = $($wmiSystem.Name)
Domain = $($wmiSystem.Domain)
Username = $($wmiSystem.Username)
OperatingSystem = $($wmiOS.Caption)
OSArchitecture = $($wmiOS.OSArchitecture)
PSVersion = "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)"
IPv4Address = $ipv4Address
Uptime = $uptime
DriveInfo = $wmiDrives
}
# Overload DriveInfo ToString
$result.DriveInfo = $result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {
"$($this.DeviceID) $($this.FreeSpace) GB;"
} -Force -PassThru
# Overload Uptime ToString
$result.Uptime = $result.Uptime | Add-Member -MemberType ScriptMethod -Name ToString -Value {
"$($this.Days) days, $($this.Hours) hours, $($this.Minutes) minutes, $($this.Seconds) seconds"
} -Force -PassThru
# Overload result ToString
$result = $result | Add-Member -MemberType ScriptMethod -Name ToString -Value {
$temp = @"
Hostname: $($this.Hostname)
Domain: $($this.Domain)
Console User: $($this.Username)
Operating System: $($this.OperatingSystem)
OS Architecture: $($this.OSArchitecture)
PS Version: $($this.PSVersion)
IPv4 Address: $($this.IPv4Address)
Uptime: $($this.Uptime.ToString())
Free Space: $($this.DriveInfo)
"@
$temp
} -Force -PassThru
似乎一切正常,但 DriveInfo 过载。我只是从中得到 "System.Object[]" 作为 return。令我感到奇怪的是,当我执行 $result.ToString() 时,我得到以下信息(参见 "Free Space"):
Domain: domain.local
Console User: domain\username
Operating System: Microsoft Windows 10 Pro
OS Architecture: 64-bit
PS Version: 5.1
IPv4 Address: 1.1.1.1
Uptime: 2 days, 1 hours, 31 minutes, 49 seconds
Free Space: C: 58721181696; E: 631496687616;
$result.Uptime.ToString():
2 days, 1 hours, 19 minutes, 34 seconds
$result.DriveInfo.ToString():
System.Object[]
我可能遗漏了一些明显的东西,但此时我迷路了。感谢您提前提供的任何帮助!
你能不能试试替换一下:
$result.DriveInfo = $result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {"$($this.DeviceID) $($this.FreeSpace) GB;"} -Force -PassThru
由
$result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {"$($this.DeviceID) $($this.FreeSpace) GB;"} -Force -PassThru
根据我的理解,Add-Member
应用于每个驱动器,您不需要影响结果,因为您更改了列表中的每个对象。之后您可以使用 :
$n = 0
$result.DriveInfo[$n].ToString()