powershell输出参数(@ {Name = name}:String)

时间:2015-12-22 16:28:49

标签: powershell hyper-v

我正在尝试在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)

喜欢它添加所有这些符号.. 失去它们的正确方法是什么?

1 个答案:

答案 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中这样做...自从我用它来记住这一点以来已经太多年了。