【发布时间】:2017-08-16 02:10:41
【问题描述】:
我正在编写一个脚本,试图输出两个不同的自定义对象;一个接一个地出现问题,所以为了简化,我把所有的代码都精简到最少:
$beep = new-object -TypeName PSObject
$beep | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "beep1"
$beep | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "beep1"
$beep
$boop = new-object -TypeName PSObject
$boop | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "boop1"
$boop | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "boop1"
$boop
当我运行它时,对象似乎组合在一起。当我做一个get-member时,它似乎只显示一个对象。为什么?
在我实际上试图完成的代码中,一个对象是上面的自定义对象,而另一个是 selected.system.int32。当我尝试一个接一个地输出时,只有第一个输出。如果我翻转订单;同样的,第一个对象得到输出。我在做什么错/不明白?
@JamesQ - 我想当我这样做时让我感到困惑:
$beep = new-object -TypeName PSObject
$beep | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "beep1"
$beep | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "beep1"
$beep | get-member
$boop = new-object -TypeName PSObject
$boop | Add-Member -MemberType NoteProperty -Name "Entry1" -Value "boop1"
$boop | Add-Member -MemberType NoteProperty -Name "Entry2" -Value "boop1"
$boop | get-member
我明白了:
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Entry1 NoteProperty System.String Entry1=beep1
Entry2 NoteProperty System.String Entry2=beep1
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Entry1 NoteProperty System.String Entry1=boop1
Entry2 NoteProperty System.String Entry2=boop1
我试图让问题保持简单,但我认为我把它弄得太模棱两可了,所以......
我正在尝试重用一些代码:
function Get-NetworkConfig($computerName) {
Get-WmiObject Win32_NetworkAdapter -Filter 'NetConnectionStatus=2' |
ForEach-Object {
$result = 1 | Select-Object Name, IP, MAC
$result.Name = $_.Name
$result.MAC = $_.MacAddress
$config = $_.GetRelated('Win32_NetworkAdapterConfiguration')
$result.IP = $config | Select-Object -expand IPAddress
$result
}
}
然后在同一个脚本中类似:
function Get-ComputerInfo($computerName) {
$operatingSystem = Get-WMIObject -computername $computerName win32_operatingsystem
$computerInfo = new-object -TypeName PSObject
$computerInfo | Add-Member -MemberType NoteProperty -Name "Computer Name" -Value ("$computerName")
$computerInfo | Add-Member -MemberType NoteProperty -Name "Operating System" -Value ("$operatingSystem.Caption")
$computerInfo
}
$computerNames = $args
foreach ($computerName in $computerNames) {
Get-ComputerInfo($computerName)
Get-NetworkConfig($computerName)
}
只显示 get-computerinfo 的输出,然后是 get-networkconfig 会输出的一堆空行。
如果我颠倒顺序;只有第一个函数给出输出,第二个函数只吐空行。
为什么我不能像这样依次调用两个函数?
【问题讨论】:
-
很大程度上取决于您尝试显示对象的方式。我运行了上面的代码,正如预期的那样,得到了两个不同的对象。
Get-Member(一次)只需要一个对象,所以我不明白你关于“显示一个对象”的说法。尝试运行不同的排列来说服自己你有多个对象:Write-Output "beep Entry1 = $($Beep.Entry1)" -
如果你想同时输出两个尝试做
return $beep, $boop -
如果您从存储在 csv 文件中的数据执行 import-csv,您将获得一个 PSCustomObjects 数组。题外话,但还是值得学习。您可能想用 $beep 和 $boop 制作一个数组。
标签: powershell