2011-07-01 60 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++")将这三件事添加到我的路径中。我希望它不添加项目,如果我已经添加它们,所以我创建了$AddedPaths数组以跟踪已添加的内容。但是,当我调用该函数时它不会更新,因此仍可以添加重复项。我究竟做错了什么?

回答

5

你需要这样做:

$Global:AddedPathes += $key 

这应该是只需要$Global:,因为它修改它的地方。

1

如果你让一个哈希表,而不是一个数组,你不必范围它在所有除非你重新使用在随后的子作用域相同的变量名。

1

由于此功能在您的个人资料中,我认为全球范围的变量可能是最好的解决方案。不过,我只是想让你知道还有另一种方式。

在其他情况下(非个人资料的功能,等等),你可能希望避免全球范围的变量,但仍然有一个功能改变一个变量,调用者有机会获得这种变化。在这种情况下,您可以创建引用变量并将其传递给您的函数(即按引用传递)。

你会做$AddedPaths阵列[ref]型的,那么把它作为参数传递给函数(现在引用类型变量):

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