我正在尝试在VM列表上运行命令Get-VMNetworkAdapter
我正在使用命令获取列表:
Get-VM –ComputerName (Get-ClusterNode –Cluster clustername)|select name
当我使用
时它看起来很好$vmm=Get-VM –ComputerName (Get-ClusterNode –Cluster clustername)|select name
foreach ($item in $vmm)
{Get-VMNetworkAdapter -VMName $item}
它给了我例外
nvalidArgument:(@ {Name = vmname}:String)
喜欢它添加所有这些符号.. 失去它们的正确方法是什么?
答案 0 :(得分:1)
您需要扩展该属性。选择除非删除对象:
$vmm = Get-VM –ComputerName (Get-ClusterNode –Cluster clustername) `
| Select-Object -ExpandProperty name
解释-ExpandProperty
的作用:
首先,-ExpandProperty
的缺点是您一次只能对一个属性执行此操作。
Select-Object
通常将结果包装在另一个对象中,以便属性保持属性。如果你说$x = Get-ChildItem C:\Windows | Select-Object Name
,那么你得到一个带有一个属性的对象数组:Name。
PS C:\> $x = Get-ChildItem C:\Windows | Select-Object Name
PS C:\> $x
Name
----
45235788142C44BE8A4DDDE9A84492E5.TMP
8A809006C25A4A3A9DAB94659BCDB107.TMP
.
.
.
PS C:\> $x[0].Name
45235788142C44BE8A4DDDE9A84492E5.TMP
PS C:\> $x[0].GetType().FullName
System.Management.Automation.PSCustomObject
注意标题? Name
是对象的属性。
此外,具有它类型的基础对象仍然是种类:
PS C:\> $x | Get-Member
TypeName: Selected.System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Name NoteProperty string Name=45235788142C44BE8A4DDDE9A84492E5.TMP
TypeName: Selected.System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Name NoteProperty string Name=bfsvc.exe
通常情况下,这一切都很棒。特别是因为我们通常需要对象的多个属性。
然而,有时候,不是我们想要的。有时,我们想要一个与我们选择的属性类型相同的数组。当我们稍后使用它时,我们希望只是那个属性而没有别的东西,我们希望它与属性完全相同的相同类型,而不是别的。
PS C:\> $y = Get-ChildItem C:\Windows | Select-Object -ExpandProperty Name
PS C:\> $y
45235788142C44BE8A4DDDE9A84492E5.TMP
8A809006C25A4A3A9DAB94659BCDB107.TMP
.
.
.
PS C:\> $y[0].Name
PS C:\> $y[0]
45235788142C44BE8A4DDDE9A84492E5.TMP
PS C:\> $y.GetType().FullName
System.Object[]
PS C:\> $y[0].GetType().FullName
System.String
注意没有标题,对Name属性的任何调用都会失败;没有Name属性了。
并且,原始对象没有遗留任何内容:
PS C:\> $y | Get-Member
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone(), System.Object ICloneable.Clone()
.
.
.
.
基本上,这就相当于这样做:
$z = Get-ChildItem C:\Windows | ForEach-Object { $_.Name }
我认为你必须在PowerShell v1.0或v2.0中这样做...自从我用它来记住这一点以来已经太多年了。