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