0

この関数が含まれているプログラムを実行すると、意味のわからない不可解なエラーが発生します。null 値の式でメソッドを実行していることに気付きませんでした。これはスコープの問題であるか、値が設定されていないことがわかりました。しかし、私はそれを理解してコミュニティに公開することができませんでした:

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
4

3 に答える 3

1

最初は 2 つの if-then ステートメントから変更して、最初の if-then ステートメントの後にブレークを挿入し、2 番目の Do-Loop に同じものを追加することで、私が抱えていた問題が解決したようです。これを行った理由は、メニューの 1 つのレイヤーを下ってから一番上のレイヤーに戻った後、reset-adapter を選択したときにエラーがないことに気付いたからです。

サイド バー: ここにリストした関数が $DCBmenuItems を繰り返し処理するメニューであるとは説明しませんでしたが、これはコードから明らかだったかもしれません。

$resetAdapter何らかの理由で正しく設定されていなかったと思います。これで問題が解決した理由と、他のコードがエラーをスローした理由については、100% 確信が持てません。修正されたコードは次のとおりです。

$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

}

于 2012-09-10T22:41:34.533 に答える
0

このエラーの場所は正しくないようです。PowerShellが条件でそのタイプのエラーをどのように取得しているかわかりませんif ()。ただし、この行がエラーの原因である可能性があります。

$DCBmenuItems3.GetUpperBound(0)

$DCBmenuItems3nullでないことを確認するためのチェックを追加します。また、問題をデバッグするとき(または通常の方法と同じように)Set-StrictMode -version latest、スクリプトの先頭に配置します。

于 2012-09-07T22:38:45.540 に答える
0
FAIL_RESULT = 0
PASS_RESULT = 1

打ち間違え ?

$FAIL_RESULT = 0
$PASS_RESULT = 1
于 2012-09-08T05:16:04.947 に答える