首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套ToString属性上重载PSObject问题

在嵌套ToString属性上重载PSObject问题
EN

Stack Overflow用户
提问于 2018-08-28 01:07:11
回答 1查看 176关注 0票数 2

我已经创建了一个具有各种属性的自定义PSObject,并且我试图为其中的一些属性重载ToString。我已经成功地使用了一个TimeSpan属性,但没有成功地使用一个WMI对象。

代码语言:javascript
复制
# 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[]“作为回报。令我感到奇怪的是,当我只执行$result.ToString()时,会得到以下内容(请参阅“空闲空间”):

代码语言:javascript
复制
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():

代码语言:javascript
复制
2 days, 1 hours, 19 minutes, 34 seconds

$result.DriveInfo.ToString():

代码语言:javascript
复制
System.Object[]

我可能遗漏了一些显而易见的东西,但我在这一点上迷失了方向。感谢您能提前提供的任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 04:45:10

你能不能试着替换:

代码语言:javascript
复制
$result.DriveInfo = $result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {"$($this.DeviceID) $($this.FreeSpace) GB;"} -Force -PassThru

通过

代码语言:javascript
复制
$result.DriveInfo | Add-Member -MemberType ScriptMethod -Name ToString -Value {"$($this.DeviceID) $($this.FreeSpace) GB;"} -Force -PassThru

根据我的理解,Add-Member应用于每个驱动器,您不需要影响结果,因为您更改了列表中的每个对象。之后,您可以使用以下方法进行测试:

代码语言:javascript
复制
$n = 0
$result.DriveInfo[$n].ToString()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52048745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档