我有一个具有多个属性的对象,我使用下面的代码在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 :