1

私は2つの関数を持っています.1つはカスタムオブジェクトを作成し、一度実行すると次の関数にパイプされます. 問題は、2 番目の関数がオブジェクトを正しく受信していないことです。パイプラインを使用する代わりに、変数を設定してから、その変数を関数にパイプしようとしました。以下は、返されたオブジェクトに対する get member の出力を持つ 2 つの関数です。すべての文字列パラメーターが正しく処理されています。しかし、オブジェクトは単に機能しません。のbeginブロックではNew-BaseGuest、結果を変数に割り当てることができません。

基本的に私は次のようになりたい:

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

New-BaseGuestパラメータを機能させることができないため、関数は不完全です。

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
{

}
}
4

1 に答える 1

1

これは予期される動作です。このbegin {}ブロックは、パイプライン オブジェクトが検出される前に実行されるため、begin ブロックでパイプラインを介して入ってくるパラメーターにはアクセスできません。

process {}ブロックは項目ごとに 1 回実行されるため、begin ブロックにあるコードは実際にはそこに配置する必要があります (単一の VM に固有であるため) 。

于 2015-08-23T19:44:09.743 に答える