2011-07-01 13 views
4

これは私のプロファイルスクリプトにあります。関数が呼び出されたときに変数が更新されない

$AddablePaths = @{ 
    "python3"=";C:\Python32"; 
    "python2"=";C:\Python27"; 
    "D"=";C:\D\dmd2\windows\bin"; 
    "gcc"=";C:\MinGW\bin"; 
    "verge"=";C:\Users\Cold\Dev\Verge\tools"; 
    "ruby"=";C:\Ruby192\bin"; 
    "git"=";C:\Program Files\Git\cmd"; 
    "cmake"=";C:\Program Files\CMake 2.8\bin"; 
    "emacs"=";C:\Users\Cold\Dev\emacs\bin"; 
    "notepad++"=";C:\Program Files\Notepad++"; 
    "boost-build"=";C:\Users\Cold\Dev\C++\boost-build\bin"; 
    "svn"=";C:\Program FIles\SlikSvn\bin"; 
    "gtk2"=";C:\Program Files\GTK2-Runtime\bin"; 
    "qt"=";C:\Qt\bin"; 
    "komodo"=";C:\Program Files\ActiveState Komodo Edit 6\"; 
    "hg"=";C:\Program Files\TortoiseHg\" 
} 

$AddedPaths = @() 

function AddPath($keys) 
{ 
    if ($keys.Count -eq 0) { return } 

    foreach ($key in $keys) 
    { 
     if ($AddablePaths.Contains($key)) 
     { 
      if (!($AddedPaths -contains $key)) 
      { 
       $env:Path += $AddablePaths[$key] 
       $AddedPaths += $key 
      } 
     } 
     else 
     { 
      Write-Host "Invalid path option. Options are:" 
      foreach ($key in $AddablePaths.keys) { 
       Write " $key" 
      } 
     } 
    } 
} 

私が必要とするものだけを自分のパスに簡単に追加できるようにすることが目的です。たとえば、AddPath("ruby","git","notepad++")と呼んで、これらの3つのものを自分のパスに追加することができます。すでに追加していれば項目を追加しないようにしたいので、すでに追加されている項目を追跡するために$AddedPaths配列を作成しました。ただし、関数を呼び出すと更新されないので、重複は追加できます。私は間違って何をしていますか?

答えて

5

あなたはこれを実行する必要があります:それはそれを修正するので、あなたが$Global:を必要とする唯一の場所である必要があり

$Global:AddedPathes += $key 

1

配列の代わりにハッシュテーブルを作成する場合は、後続の子スコープで同じ変数名を再使用しない限り、配列をまったくスコープする必要はありません。

1

この機能はあなたのプロファイルにあるので、グローバルスコープ変数がおそらく最適なソリューションだと思います。しかし、私はちょうどあなたに別の方法があることを伝えたいと思っていました。

他のシナリオ(プロファイル以外の関数など)では、グローバルスコープ変数を避けても、変数を変更して呼び出し元がその変更にアクセスできるようにすることができます。この場合、参照変数を作成して関数に渡すことができます(つまり、参照渡し)。

あなたはタイプ[ref]$AddedPaths配列になるだろうし、あなたの関数にパラメータとして渡す(現在参照型の変数を持つ):

function AddPath($keys, [ref]$ActivePaths) 
{ 
    if ($keys.Count -eq 0) { return } 

    foreach ($key in $keys) 
    { 
     if ($AddablePaths.Contains($key)) 
     { 
      if (!($ActivePaths.Value -contains $key)) 
      { 
       $env:Path += $AddablePaths[$key] 
       $ActivePaths.Value += $key 
      } 
     } 
     else 
     { 
      Write-Host "Invalid path option. Options are:" 
      foreach ($key in $AddablePaths.keys) { 
       Write " $key" 
      } 
     } 
    } 
} 

> [ref]$AddedPaths = @() 
> AddPath -keys ("ruby","git","notepad++") -ActivePaths $AddedPaths 

> $AddedPaths 

Value 
----- 
{ruby, git, notepad++} 

が参照変数の詳細ヘルプを取得するには

> help about_ref 
関連する問題