使用Powershell中的函数修改对象属性

时间:2016-07-01 10:10:34

标签: function powershell powershell-v2.0

我有一个具有多个属性的对象,我使用下面的代码在Powershell 2.0中创建。我想要做的是在一个函数中创建对象并在另一个函数中修改属性。我在下面写的代码应该这样做,但返回的对象只有null属性。

有谁能看到我哪里出错?

function New-Component{
    $componentObject = New-Object PSObject |
            #The XML Node read straight from the XML Object in Memory
            Add-Member Noteproperty -Name xMLNode -Value $([System.Xml.XmlElement] $componentXMLList[$i]) -PassThru |
            #A Boolean flag
            Add-Member Noteproperty -Name installFlag -Value $([Boolean] $false) -PassThru | 
            ...
    return $componentObject
}

这将根据需要返回对象,并且属性仍然存在,如输出 -

所示
> [PSObject] $componentObject = New-Component; $componentObject.xMLNode


name        : Program Name
platform    : x86
msiFilename : Product\Win32\Program.msi
arguments   : SETUPINVOKED=1
interactive : true

然而,当我通过管道传递给我的下一个函数(或者我最初尝试的命名输入)时,属性在返回父对象后变为null。

function Get-MSIData{
    [cmdletbinding()]
    param(
        [parameter( Mandatory=$True,
                    ValueFromPipeline=$true)]
        [PSObject] $componentObject
    )


#Load .msi Database into memory
    [System.MarshalByRefObject] $mSIDatabase = 
        Get-MSIDatabase -msiPath "$scriptPath\$( $componentObject.xMLNode.getAttribute("msiFilename") )"        

    #Extract Product Code - note that Property type must have ' ' pair within " " pair
    [String]$installerProductCode = Get-MSIRecord -propertyType "'ProductCode'" -mSIDatabase $mSIDatabase
    $componentObject.installerProductCode = $installerProductCode.Trim()

    #Extract Version Number - Converted to String as sometimes hits error casting directly from System.Object[]
    [System.Version]$installVersion = Get-MSIRecord -propertyType "'ProductVersion'" -mSIDatabase $mSIDatabase | Out-String
    $componentObject.installVersion = $installVersion

    #Extract Product Name for alias searching
    [String] $aliasProgName = Get-MSIRecord -propertyType "'ProductName'" -mSIDatabase $mSIDatabase | Out-String
    $componentObject.aliasProgName = $aliasProgName.Trim()

    #Dereference Database
    Close-Database -mSIDatabase $mSIDatabase

    #Get Installer Package Name for alias searching
    [String] $packageName = $componentObject.xMLNode.getAttribute("msiFilename") | Split-Path -Leaf | Out-String

    Write-Verbose "$($componentObject.xMLNode | Out-String)"

    Return $componentObject
}

函数的详细输出显示componentObject.xMLNode在函数末尾不为空。但是,返回对象后,它为空。

> [PSObject] $componentObject = New-Component
  $componentObject.xMLNode
  $componentObject = $componentObject | Get-MSIData
  "xMLNode is null? $($componentObject.xMLNode -eq $null)"


name        : Program Name
platform    : x86
msiFilename : Product\Win32\Program.msi
arguments   : SETUPINVOKED=1
interactive : true

name        : Program Name
platform    : x86
msiFilename : Product\Win32\Program.msi
arguments   : SETUPINVOKED=1
interactive : true

xMLNode is null? True
然而,真正让我困惑的事实是,即使属性为null,xMLNode被称为“Component”仍然会显示。我指定的其他值仍然出现在写输出 -

$componentObject


xMLNode              : Component
installFlag          : False
uninstallFlag        : False
installerProductCode : {359F6F4E-C5B6-423F-B4C4-XXXXXXXXXX}
systemProductCode    : 
installVersion       : 6.73.5542.1
systemVersion        : 
oSRestricted         : False
oSVersionMatch       : False
aliasProgName        : Alias
packageName          : 

0 个答案:

没有答案