Powershell对象未通过管道传递给Function [英] Powershell Object not being piped through to Functions

查看:82
本文介绍了Powershell对象未通过管道传递给Function的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个函数,一个创建一个自定义对象,完成后将其传递给下一个函数.问题是第二个功能不能正确接收我的对象.我没有使用管道,而是尝试设置变量,然后将该变量通过管道传递给函数.以下是在返回的对象上具有get成员输出的两个函数.所有字符串参数均已正确处理.但是这些对象根本无法工作.在New-BaseGuestbegin块中,我无法将结果分配给变量.

I have two functions one creates a custom object which once done is piped to the next function. The problem is that the second function is not receiving my object correctly. Instead of using the pipeline I have tried setting a variable and then piping that variable to the function. Below are the two functions with the output of get member on the returned object. All the string param are being processed correctly. But the objects simply wont work. In the begin block of the New-BaseGuest I am not able to assign the results to the variables.

基本上我想结束:

Get-ServerFromXML -XMLFile File -GuestName Name | New-BaseGuest

New-BaseGuest函数不完整,因为我无法使参数正常工作.

The New-BaseGuest function is incomplete as I cannot get the parameters working.

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()              
CDROM_Connected  NoteProperty object CDROM_Connected=null    
CDROM_ISO        NoteProperty object CDROM_ISO=null          
Floppy_Connected NoteProperty object Floppy_Connected=null   
Floppy_ISO       NoteProperty object Floppy_ISO=null         
GuestType        NoteProperty string GuestType=vmkernel6Guest
IPAddress        NoteProperty string IPAddress=192.168.199.40
ServerName       NoteProperty string ServerName=ESX-VSAN3    
vCPU             NoteProperty string vCPU=2                  
vHDD             NoteProperty Object[] vHDD=System.Object[]  
vNIC             NoteProperty Object[] vNIC=System.Object[]  
vRAM             NoteProperty string vRAM=5120   


function Get-ServerFromXML
{
 <##>

[CmdletBinding()]
param
(
    [String]
    $XMLFile,

    [String]
    $GuestName
)
$xml = New-Object -TypeName XML
$xml.Load($XMLFile)
$Server = Select-Xml -Xml $xml -XPath ('/Servers/Server[@Name = "' + $GuestName + '" ]')
$vNicObjs = @()
$vHddobjs = @()
If ($Server.Node.Hardware.vnic.Count -ne $null)
{
    $Server.Node.Hardware.vnic | %{
        $NicProps = @{
            NIC_ID = $_.ID;
            NIC_Type = $_.Type;
            NIC_StartConnected = $_.StartConnected;
            NIC_MACAddress = $_.MACAddress;
            NIC_WakeOnLan = $_.WakeOnLan;
            NIC_PortGroup = $_.PortGroup
        }
        $vNicObj = New-Object -TypeName System.Management.Automation.PSObject -Property $NicProps
        $vNicObjs += $vNicObj
    }
}
Else
{
    $NicProps = @{
        NIC_ID = $Server.Node.Hardware.vnic.ID;
        NIC_Type = $Server.Node.Hardware.vnic.Type;
        NIC_StartConnected = $Server.Node.Hardware.vnic.StartConnected;
        NIC_MACAddress = $Server.Node.Hardware.vnic.MACAddress;
        NIC_WakeOnLan = $Server.Node.Hardware.vnic.WakeOnLan;
        NIC_PortGroup = $Server.Node.Hardware.vnic.PortGroup
    }
        $vNivObj = New-Object -TypeName System.Management.Automation.PSObject -Property $NicProps
        $vNicObjs += $vNivObj
}

If ($Server.Node.Hardware.vHDD.Count -ne $null)
{
    $Server.Node.Hardware.vHDD | %{
        $HDDProps = @{
            HDD_ID = $_.ID;
            HDD_Type = $_.Type;
            HDD_Size = $Server.Node.Hardware.vHDD.Size;
            HDD_Datastore = $_.Datastore;
            HDD_StorageFormate = $_.StorageFormat
        }
        $vHDDObj = New-Object -TypeName System.Management.Automation.PSObject -Property $HDDProps
        $vHDDObjs += $vHDDObj
    }
}
Else
{
    $HDDProps = @{
        HDD_ID = $Server.Node.Hardware.vHDD.ID;
        HDD_Type = $Server.Node.Hardware.vHDD.Type;
        HDD_Size = $Server.Node.Hardware.vHDD.Size;
        HDD_DataStore = $Server.Node.Hardware.vHDD.Datastore;
        HDD_StorageFormat = $Server.Node.Hardware.vHDD.StorageFormat
    }
    $vHDDObj = New-Object -TypeName System.Management.Automation.PSObject -Property $HDDProps
    $vHDDObjs += $vHDDObj
}


$ServerProps =[Ordered]@{
    ServerName = $Server.Node.Description.Name;
    GuestType = $Server.Node.Description.GuestType;
    IPAddress = $Server.Node.Description.PrimaryIP;
    vCPU = $Server.Node.Hardware.vCPU;
    vRAM = $Server.Node.Hardware.vRAM;
    vHDD = $vHddobjs;
    vNIC = $vNicObjs;
    CDROM_ISO = $Server.Node.Hardware.CDROM.ISOPath
    CDROM_Connected = $Server.Node.Hardware.CDROM.StartConnected
    Floppy_ISO = $Server.Node.Hardware.Floppy.ISOPath
    Floppy_Connected = $Server.Node.Hardware.Floppy.StartConnected
}

$ServerObj = New-Object -TypeName System.Management.Automation.PSObject -Property $ServerProps
$ServerObj
}

function New-BaseGuest
{
 <##>

[CmdletBinding(PositionalBinding = $true,
               SupportsShouldProcess = $true)]
param
(
    [Parameter(Mandatory = $true,
               ValueFromPipeline = $false,
               ValueFromPipelineByPropertyName = $true,
               Position = 1)]
    [string]
    $ServerName,

    [Parameter(Mandatory = $true,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 2)]
    [string]
    $GuestType,

    [Parameter(Mandatory = $true,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 3)]
    [string]
    $vCPU,

    [Parameter(Mandatory = $true,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 4)]
    [string]
    $vRAM,

    [Parameter(Mandatory = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 5)]
    [system.object]
    $vHDD,

    [Parameter(Mandatory = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 6)]
    [system.object]
    $vNIC,

    [Parameter(Mandatory = $false,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 7)]
    [string]
    $CDROM_ISO = $Null,

    [Parameter(Mandatory = $false,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 8)]
    [string]
    $FLOPPY_ISO = $Null,

    [Parameter(Mandatory = $false,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 9)]
    [string]
    $CDROM_Connected = $Null,

    [Parameter(Mandatory = $true,
               ValueFromPipeline = $true,
               ValueFromPipelineByPropertyName = $true,
               Position = 10)]
    [string]
    $Floppy_Connected = $Null
)

BEGIN 
{
    $Datastore  = ($vHDD | Where-Object { $_.HDD_ID -eq 1 } | Select-Object -Property HDD_DataStore).HDD_DataStore
    $PortGroup  = ($vNIC | Where-Object { $_.NIC_ID -eq 1 } | Select-Object -Property NIC_PortGroup).NIC_PortGroup
    $DiskSize   = ($vHDD | Where-Object { $_.HDD_ID -eq 1 } | Select-Object -Property HDD_Size).HDD_Size
    $DiskFormat = ($vHDD | Where-Object { $_.HDD_ID -eq 1 } | Select-Object -Property HDD_StorageFormat).HDD_StorageFormat
}
PROCESS
{
    New-VM -Name $ServerName `
           -Datastore $Datastore `
           -NumCPU $vCPU `
           -MemoryGB $vRAM`
           -DiskGB $DiskSize `
           -NetworkName $PortGroup `
           -DiskStorageFormat $CDROM_ISO `
           -GuestID $GuestType | Out-Null
}
END
{

}
}

推荐答案

这是预期的行为. begin {}块在遇到任何管道对象之前运行,因此您无权访问begin块中通过管道输入的任何参数.

This is expected behavior. The begin {} block runs before any pipeline objects are encountered, so you have no access to any parameters that come in through the pipeline in your begin block.

process {}块对每个项目都运行一次,因此,确实需要将begin块中的代码放入其中(因为它特定于单个VM).

The process {} block is run once for each item, so the code you have in the begin block really needs to be put there (because it's specific to a single VM).

这篇关于Powershell对象未通过管道传递给Function的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆