Powershell [Ref] Стойността не актуализира основния обект

Изпълнявам Powershell V2 на XP: Това е част от по-голям скрипт и забелязвам някои аномалии в начина, по който мога да използвам референтни обекти, за да актуализирам „главния“ обект. Това започна като начин да се избегне въвеждането на сложното име на имота всеки път - лесно можех да разширя до пълното име, но сега причината за това поведение сериозно ме притеснява.

[CmdletBinding()]
Param()
Function Breakhere {Write-Verbose " "}
Set-PSBreakpoint -Command Breakhere
$Data = @"
UserID
MyUser1
MyUser2
User3
"@
$Data = $Data|ConvertFrom-Csv

$Domains = "DomainA","DomainB"

$Props = "ParentContainer","AccountIsDisabled","employeeNumber"
$Connection = New-Object HashTable

ForEach ($Domain in $Domains)
{
    Write-Verbose "Current Domain: $Domain"
    # Add necessary headers to main data
    $text1 = "$($Domain)_ADObject"
    $text2 = "$($Domain)_Confidence"
    $Data = $Data |Select *,$text1
    $Data = $Data |Select *,$text2

    #Bind to each domain and save the connection contexts into a hashtable
    Write-Verbose "Binding to $Domain"
    $Connection.Add($Domain,(Connect-QADService -service $Domain))
}

ForEach ($User in $Data)
{
    ForEach ($Domain in $Domains)
    {
        $User."$($Domain)_ADObject" = Get-QADUser -Connection $Connection[$Domain] -SamAccountName $User.UserID -DontUseDefaultIncludedProperties -IncludedProperties $Props|Select $Props

        # Referencing the confidence parameter does not seem to work.
        $CF = [ref]$User."$($Domain)_Confidence"
        # Weirdly, this one does work.
        $AD = [ref]$User."$($Domain)_ADObject"

        If ($AD.Value)
        {
            $CF.Value = 1 
            Breakhere # Break here and allow for opportunity to inspect $user and $CF objects

            If ($AD.Value.AccountIsDisabled)
            {
                Write-Verbose "$Domain\$($User.UserID): Account Disabled"
                $CF.Value *= 0.8
            }
        }
        Else
        { 
            Write-Verbose "$Domain\$($User.UserID): No AD Object found"
            $CF.Value = 0
        }
    }
} #End ForEach $UserID

В точката на прекъсване, ако направя запитване към $User, получавам нещо подобно на следното:

UserID             : MyUser1
DomainA_ADObject   : @{ParentContainer=DomainA/Users; AccountIsDisabled=False; employeeNumber=123456}
DomainA_Confidence : 
DomainB_ADObject   : 
DomainB_Confidence : 

Всичко е наред. Ако пожелая, мога дори да използвам обекта $AD ref и да актуализирам DomainA_ADobject:

$AD.Value.employeeNumber = 9999
$User

UserID             : MyUser1
DomainA_ADObject   : @{ParentContainer=DomainA/Users; AccountIsDisabled=False; employeeNumber=9999}
DomainA_Confidence : 
DomainB_ADObject   : 
DomainB_Confidence : 

Опитайте обаче това с $CF ref и същото нещо няма да се случи

$CF.Value = 2
$CF

Value
-----
2

$User

UserID             : MyUser1
DomainA_ADObject   : @{ParentContainer=DomainA/Users; AccountIsDisabled=False; employeeNumber=9999}
DomainA_Confidence :                         *<====== Expecting this to update!*
DomainB_ADObject   : 
DomainB_Confidence : 

Защо разликата? Има ли някакъв начин да направите запитване към [ref] обект и да видите към какво сочи? Не виждам защо единият работи, а другият не. Изглежда, че и двамата са устроени по един и същи начин. Опитах това в ISE и конзола, същото поведение и в двете.


person Dave_J    schedule 19.09.2014    source източник
comment
Изпитвам нещо подобно и не мога да намеря обяснение   -  person samaspin    schedule 02.10.2014
comment
[ref] не трябва да работи тук. Той е за извикване на методи с ref параметри, а не за препратка към свойства.   -  person user4003407    schedule 24.12.2014


Отговори (1)


Предполагам, че това се дължи на точките в името на домейна. Намаляването на това до основи $CF.Value = 1 прави нещо подобно

$Data[0].domain.name.net.au_Confidence.value = 1

Това няма да работи. Това ще:

$Data[0]."domain.name.net.au_Confidence".стойност = 1

Може би това ще го поправи?:

$CF = [ref]$User."`"$($Domain)_Confidence`""
person Jan Chrbolka    schedule 24.12.2014