2017-07-01 14 views
0

Ich habe eine seltsame Ich habe die vorhandene Q & A gesucht und habe keine Übereinstimmung gefunden. Ich habe meine Funktionen geschrieben Parametervalidierung mit dem Basisformat mitPowershell Parameter passing Problem

function FunctioName 
{ 
    [CmdletBinding()] 
    Param(
    [parameter(Mandatory)] 
    [String]$VariableName 
    ) 

Wenn ich den Parameter auf Mandatory gesetzt, wie oben ich eine Parameterbindung Ausnahme angibt, einen Nullwert erhalten wurde übergeben. Beim Ausführen des Skripts im Debugging kann ich sehen, dass der übergebene Funktionsparameter nicht null ist und eine gültige Zeichenfolge ist. Wenn ich das Skript auf die gleiche Weise ohne das obligatorische Flag ausführen, wird die Zeichenfolge an die Funktion übergeben und es wird ordnungsgemäß ausgeführt. Hat jemand irgendwelche Ideen, was könnte das Problem sein. Dieses Problem betrifft eine Reihe von Funktionen in meiner Anwendung. Interessanterweise scheint es, dass die betroffenen Funktionen alle nur einen einzigen Parameter haben. Funktionen mit mehreren Parametern scheinen nicht betroffen zu sein.

Ok danke Jungs für Ihr Feedback, das sehr geschätzt wird. Übrigens verwende ich Powershell 5. Weiter zu dem Problem, wenn ich weiter nachdachte, fand ich, dass die Variable an die Funktion als ein Array von Strings übergeben wurde, jedoch wurde ein leerer String-Wert an das Array angehängt, was meiner Meinung nach die Ursache für das Problem war. Hier fängt es an, interessant zu werden, ich muss etwas mehr Hintergrund geben.

Das Skript, das ich ausführe Abfragen Active Directory für Benutzerattribute treffen bestimmte Bedingungen, die, die übereinstimmen Ich erstelle ein Array von Zeichenfolgen mit jedem Wert ein begrenzter Wert des Benutzers, Hostname und andere Attributeigenschaften. Um sicherzustellen, dass ich die neuesten Werte bekomme, verwende ich die ASDI GetInfo Methode, die das seltsame Verhalten auszulösen scheint.

Auf einem hohen Niveau sind die Funktionen

Function GetuserAttr 
{ 
    $inscopeusers = New-Object System.Collections.ArrayList 
    $accountlist = (Get-ADUser -Filter { attribute1 -eq "value"} -Properties attribute1).SamAccountName 

foreach ($user in $accountlist) 
{ 
    $DN = getDN($user) # basically a funtion I wrote to create ASDI object for user account. 
    $DN.GetInfo() # this method call appears to cause issues 
    $attr1 = $DN.Get("Attribute1") 
    $attr2 = $DN.Get("Attribute2") 
    $hoststring = "$($user)|$($attr1)|$($attr2)" 
    $inscopeusers.Add($hoststring) > null 
} 
return $inscopeusers 
} 

Die String-Array in dieser Funktion zurückgegeben wird, in eine Anzahl von anderen Funktionen zugeführt, von denen die eine, die den Fehler gab, die ich ursprünglich erzogen . Die Sache ist, wenn ich die GetInfo-Methode das Array von dieser Funktion zurückgegeben enthält mehrere Null-Werte im Array, wenn ich den Befehl das Array hat keine Null-Strings. Noch seltsamer, wenn ich mit dem Array in anderen Funktionen arbeite, scheint es, dass das Array einige der Eigenschaften verliert, wenn die GetInfo-Methode verwendet wird. So bin ich zum Beispiel in der Lage, die foreach-Schleife zu verwenden, um durch Array-Werte zu iterieren, aber ich kann nicht auf einen Array-Wert per Index wie $ array [1] zugreifen. Durch einfaches Auskommentieren des GetInfo-Methodenaufrufs in der Funktion scheint das zurückgegebene Array normal zu funktionieren und Sie können auf Array-Werte nach Index zugreifen.

Ich habe eine andere Funktion, die GetInfo verwendet und eine Hashtabelle zurückgibt, wenn ich versuche, auf die zurückgegebene Hashtabelle zu arbeiten, kann ich nicht mit einem Schlüsselwert wie $ hashtable ['key'] zugreifen, aber ich kann darauf zugreifen mit $ hashtable.key. Ich weiß, das ist wirklich seltsam und kann nicht wirklich denken, was es sein könnte

Hat jemand anderes ein ähnliches Problem erlebt.

+2

Benötigen Sie weitere Informationen? Kann nicht Repro. – Jaykul

+0

'FunctioName -VariableName ([string] :: Empty)' würde fehlschlagen obwohl '([string] :: Empty)' ist eine _valid_ string und '([string] :: Empty) -eq $ null' gibt' false' zurück . Es scheint, dass '$ VariablenName' Argument _mandatory_ getestet wird mit etwas wie' [string] :: IsNullOrEmpty ($ VariablenName) 'als' [string] :: IsNullOrEmpty ([string] :: Empty) 'gibt' true' zurück. – JosefZ

+1

Können Sie die Version von PowerShell bereitstellen, in der Sie dies ausführen möchten? '$ PSVersionTable' sollte Ihnen das geben. Ich glaube, die Kurzsyntax '[Parameter (Mandatory)]' ist nicht gültig bis PS v3, also wenn du in PS v2 bist, musst du '[Parameter (Mandatory = $ true)]' 'verwenden. – beavel

Antwort

0

Sie vermissen ein Argument.

Function Test 
{ 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$True)] 
     [String] 
     $Variable 
    ) 

    Write "$Variable" 
} 
+1

'[Parameter (obligatorisch = $ True)] ist identisch mit' [Parameter (obligatorisch)] '. – JosefZ