2012-09-07 1 views
0

Lorsque j'exécute le programme, cette fonction est activée. Je reçois une erreur cryptique qui n'a aucun sens pour moi. Je n'étais pas au courant que j'utilisais une méthode sur une expression à valeur nulle. Il me vient à l'esprit que c'est un problème de portée ou qu'une valeur n'est pas définie. J'ai cependant pas été en mesure de le comprendre et de le mettre à la communauté:PowerShell - If Then: impossible d'appeler une méthode sur une expression à valeur nulle

You cannot call a method on a null-valued expression. 
At C:\Users\Administrator\Desktop\DCB Settings Modification\DCBxPowershell.ps1:747 char:21 
+     If ($resetAdapter -eq $FAIL_RESULT){ 
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
+ FullyQualifiedErrorId : InvokeMethodOnNull 
You cannot call a method on a null-valued expression. 
At C:\Users\Administrator\Desktop\DCB Settings Modification\DCBxPowershell.ps1:760 char:17 
+    If ($resetAdapter -eq $FAIL_RESULT){ 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
+ FullyQualifiedErrorId : InvokeMethodOnNull** 

$FAIL_RESULT = 0 
$PASS_RESULT = 1 

Function Use-Menu 
{ 
    param($DCBmenuItems, $modificationCatagoryChoosen) 

    ## Function Menu-Choose --## Holds choosen Network Interface Index to work with    
    $networkIndex = Menu-Choose $strippedNetworkIndex $networkChooseTitle 
    #$networkIndex[0] ### Debug - 
    $resetAdapter = $FAIL_RESULT 

    Start-Sleep -s .7 

    If ($result = $PASS_RESULT) { 
    ## Find Current Config in order to display it to user 
     $dcbConfig = Find-Config $networkIndex 
    } 

    #The following 'DO WHILEs' are for the "Go back to previous Menu" functionality. 
    Do { 
     Do { 

      ## Function Menu-Choose --## Let user choose which catagory of modification to perform 
      $modificationCatagoryChoosen = Menu-Choose $DCBmenuItems $DCBMenuTitle $networkIndex -scope global 
      If (($DCBmenuItems.count - 1) -eq $modificationCatagoryChoosen) { 
       $resetAdapter = $PASS_RESULT 
      } 

      # These If Then statements allow reset of adapter without changing settings 
      If ($resetAdapter -eq $FAIL_RESULT){ 
       $DCBmenuItems2 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].Option 
       $DCBMenuTitle2 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].Name 

       Start-Sleep -s .7 

       ## Function Menu-Choose --## Let user choose which modification to perform 
       $modificationChoosen = Menu-Choose $DCBmenuItems2 $DCBMenuTitle2 $networkIndex 
      } 

     } While (($modificationChoosen -eq $DCBmenuItems2.GetUpperBound(0)) -and ($resetAdapter -eq $FAIL_RESULT)) 

     # These If Then statements allow reset of adapter without changing settings 
     If ($resetAdapter -eq $FAIL_RESULT){ 
      ## Changes the options to choose on Menu-Choose to last chosen catagory 
      $DCBmenuItems3 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].SubMenu[$modificationChoosen].Option 
      $DCBMenuTitle3 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].SubMenu[$modificationChoosen].Name 

      Start-Sleep -s .7 

      ## Function Menu-Choose --## Let user choose how to modify DCB setting 
      $modificationOptionChoosen = Menu-Choose $DCBmenuItems3 $DCBMenuTitle3 $networkIndex 
     } 
    } While (($modificationOptionChoosen -eq $DCBmenuItems3.GetUpperBound(0)) -and ($resetAdapter -eq $FAIL_RESULT)) 

    # These If Then statements allow reset of adapter without changing settings 
    If ($resetAdapter -eq $FAIL_RESULT){ 
     Start-Sleep -s .7 

     ## Function Set-RegistryValues --## Records modified DCB setting to registry 
     Set-RegistryValues $xmlDCBregEdits $modificationCatagoryChoosen $modificationChoosen $modificationOptionChoosen 
    } 

Return $networkIndex 
+0

Je sais que c'est un ancien poste, mais, je remarque ici et ci-dessous, vous avez la ligne 'Si ($ result = $ PASS_RESULT) {'. La variable '$ result' n'est pas utilisée ailleurs - il n'est pas du tout évident de savoir à quoi elle sert. Mais le plus important, voulez-vous dire 'If ($ result -eq $ PASS_RESULT) {'? Et est-ce que c'était peut-être une faute de frappe "traduction" quand vous avez dépouillé votre code pour la présentation ici, et si oui, cela a-t-il pu avoir quelque chose à voir avec votre problème? Il suffit de demander, car 'if ($ result = $ PASS_RESULT) {' dans ce contexte est juste mauvais. –

Répondre

0

Il semble que le changement de deux si-alors d'abord à insérer des pauses après ma déclaration initiale if-then et en ajoutant un identique au deuxième Do-boucle a résolu le problème que je faisais. La raison pour laquelle je l'ai fait est qu'après avoir descendu une couche de mon menu et que je suis retourné à la couche supérieure, j'ai remarqué que l'erreur était absente lors du choix de reset-adapter.

Side Bar: I didn't explain that the function I listed here was a menu that iterates through the $DCBmenuItems, although this may have been obvious from the code.

Je pense que $resetAdapter n'a pas été défini correctement pour une raison quelconque. Je ne suis pas sûr à 100% de savoir pourquoi cela a résolu mon problème et pourquoi l'autre code a jeté des erreurs. Voici le code modifié:

$FAIL_RESULT = 0 
$PASS_RESULT = 1 

Function Use-Menu 
{ 
    param($DCBmenuItems, $modificationCatagoryChoosen) 

    ## Function Menu-Choose --## Holds choosen Network Interface Index to work with    
    $networkIndex = Menu-Choose $strippedNetworkIndex $networkChooseTitle 
    #$networkIndex[0] ### Debug - 

    $resetAdapter = $FAIL_RESULT 
    $modificationCatagoryChoosen = $null 
    $modificationChoosen = $null 
    $modificationOptionChoosen = $null 
    $DCBmenuItems2 = $null 
    $DCBMenuTitle2 = $null 
    $DCBmenuItems3 = $null 
    $DCBMenuTitle3 = $null 

    Start-Sleep -s .7 

    If ($result = $PASS_RESULT) { 
    ## Find Current Config in order to display it to user 
     $dcbConfig = Find-Config $networkIndex 
    } 

    #The following 'DO WHILEs' are for the "Go back to previous Menu" functionality. 
    Do { 
     Do { 

      ## Function Menu-Choose --## Let user choose which catagory of modification to perform 
      $modificationCatagoryChoosen = Menu-Choose $DCBmenuItems $DCBMenuTitle $networkIndex -scope global 
      If (($DCBmenuItems.count - 1) -eq $modificationCatagoryChoosen) { 
       $resetAdapter = $PASS_RESULT 
       break 
      } 

      # These If Then statements allow reset of adapter without changing settings 

      $DCBmenuItems2 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].Option 
      $DCBMenuTitle2 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].Name 

      Start-Sleep -s .7 

      ## Function Menu-Choose --## Let user choose which modification to perform 
      $modificationChoosen = Menu-Choose $DCBmenuItems2 $DCBMenuTitle2 $networkIndex 


     } While (($modificationChoosen -eq $DCBmenuItems2.GetUpperBound(0)) -and ($resetAdapter -eq $FAIL_RESULT)) 

     If (($DCBmenuItems.count - 1) -eq $modificationCatagoryChoosen) { 
       break 
     } 
     # These If Then statements allow reset of adapter without changing settings 

     ## Changes the options to choose on Menu-Choose to last chosen catagory 
     $DCBmenuItems3 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].SubMenu[$modificationChoosen].Option 
     $DCBMenuTitle3 = $xmlDCBoptions.MenuItems.MenuOptions[$modificationCatagoryChoosen].SubMenu[$modificationChoosen].Name 

     Start-Sleep -s .7 

     ## Function Menu-Choose --## Let user choose how to modify DCB setting 
     $modificationOptionChoosen = Menu-Choose $DCBmenuItems3 $DCBMenuTitle3 $networkIndex 

    } While (($modificationOptionChoosen -eq $DCBmenuItems3.GetUpperBound(0)) -and ($resetAdapter -eq $FAIL_RESULT)) 

    # These If Then statements allow reset of adapter without changing settings 
    If ($resetAdapter -eq $FAIL_RESULT){ 
     Start-Sleep -s .7 

     ## Function Set-RegistryValues --## Records modified DCB setting to registry 
     Set-RegistryValues $xmlDCBregEdits $modificationCatagoryChoosen $modificationChoosen $modificationOptionChoosen 
    } 

Return $networkIndex 

}

0

L'emplacement de cette erreur ne semble pas juste. Je ne vois pas comment PowerShell obtient ce type d'erreur sur la condition if(). Cependant, cette ligne pourrait être la cause de l'erreur:

$DCBmenuItems3.GetUpperBound(0) 

Ajouter un chèque pour vous assurer que $DCBmenuItems3 est non nul. En outre, lors du débogage des problèmes (ou diable juste comme une pratique normale), j'ai mis Set-StrictMode -version latest en haut de mes scripts.

+0

Merci pour la réponse Keith. Je vais vérifier dans $ DCBmenuItem3 et m'assurer que ce n'est pas null. Je vais aussi essayer 'Set-StrictMode -version latest' et voir si cela illumine quelque chose. L'erreur me dérangeait aussi, je pensais que cela pourrait être dans une autre partie du code. Je vous ferai savoir si cela aide. Merci encore. – IkeaTheSofa

+0

J'ai ajouté 'Set-StrictMode -version latest' et bien qu'il ait jeté quelques autres erreurs inattendues, après avoir réparé ceux-ci encore des erreurs sur la condition If(). Bizarre. – IkeaTheSofa

0
FAIL_RESULT = 0 
PASS_RESULT = 1 

typo?

$FAIL_RESULT = 0 
$PASS_RESULT = 1 
+0

Oui c'était une faute de frappe. Dans mon script, je déclare ceci de la façon suivante: '## Valeur une fonction retournera est elle passe Set-Variable PASS_RESULT -option Constante -value 1 -ea SilentlyContinue ## Valeur une fonction retournera est elle passe Set-Variable FAIL_RESULT -option Constante -valeur 0 -ea SilentlyContinue' Quand je les ai écrits dans cet exemple j'ai oublié le $. – IkeaTheSofa

Questions connexes