调用函数时变量不更新

时间:2011-07-01 01:39:10

标签: powershell

我在个人资料脚本中有这个。

$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数组来跟踪已经添加的内容。但是,当我调用该函数时它不会更新,因此仍然可以添加重复项。我做错了什么?

3 个答案:

答案 0 :(得分:6)

你需要这样做:

$Global:AddedPathes += $key

这应该是您需要$Global:的唯一地方,因为它会修改它。

答案 1 :(得分:1)

如果您将其作为哈希表而不是数组,则除非在后续子范围中重复使用相同的变量名,否则不必对其进行范围化。

答案 2 :(得分: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