1

メニューを使用するか、スクリプトに引数として渡すことで、必要な値を変更できるスクリプトのメニューシステムを作成しています。現時点で困っていることの 1 つは、メニューの更新時に新しい値を入力した後、メニュー テキストの変数が新しい値に更新されないことです。

      $global:drive="C:"

      $title = "Setup 

      "
           $message = "The default variables are:
            VARIABLES TO CHANGE

            1. The Drive Location: $global:drive <<<--- This is the variable that does not update after I change it when I run the script.
       "

      $one = New-Object System.Management.Automation.Host.ChoiceDescription "&1 Drive", "The Drive Location:"

      $options = [System.Management.Automation.Host.ChoiceDescription[]]($one)

     :OuterLoop do 
{ 
    for ($i = 1; )
    {

      $result =  $host.ui.PromptForChoice($title, $message, $options, 1) 

    switch ($result)
        {
            0 {$global:drive = Read-Host "Drive is $global:drive .Set the  Drive Location";
                "The Drive is now: $global:drive";
                break;}

          }

                }
}

 while ($y -ne 100)

最初は変数をグローバルに設定しませんでしたが、ここでそれが役立つかもしれないと読んでください。それはしませんでしたが、どちらも傷つけませんでした。また、スクリプトにも設定してみました。変数は変化するので、これは何よりも表面的なものです。

ありがとう

4

1 に答える 1

1

コードを実行しましたが、メニューが変更されました。私がした唯一のことはあなたの最初のコメントアウトでした$global:drive="C:"。これが常にスクリプトの先頭にある場合は、$global:drive常に。が表示されますC:

次のコードを使用して変数の存在を確認し、値がまだ存在しない場合は値を割り当てることができます。

if $(!(Get-Variable -Name Drive -Scope global -ErrorAction SilentlyContinue)) { $global:drive="C:" }

グローバル変数Driveが存在する場合、それは何もしません。存在しない場合は、$global:driveに設定されC:ます。お役に立てれば。

@Normコメントの後に編集:

メッセージが更新されない理由は、$titleがループの外側に設定されているためです。はすでに定義されているため$Title、ループを実行するたびに変更する必要はありません。$Title行の前のループ内の宣言を移動するだけ$result = $host.ui.PromptForChoice($title, $message, $options, 1)です。これにより、発生している問題が修正されるはずです。

Edit2:申し訳ありませんが、$message移動する必要があります。$title

于 2012-08-21T14:52:02.810 に答える