我希望有一个数组,并从我的脚本中的不同函数添加元素。我下面的例子说明了我可能误解了有关范围的问题。我目前的理解是,如果在函数外部定义了一个数组,然后在函数内部添加了元素,那么这些元素应该在函数外部可用。
Function ListRunningServices
{
$services+= Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name;
}
$services = @();
ListRunningServices;
$services;
我在这里缺少什么?也许我的风格完全错了。
答案 0 :(得分:5)
你可以用全局变量来解决这个问题,但是使用全局变量通常被认为是不好的做法。如果您使用泛型集合类型(如arraylist)而不是数组,那么您将拥有一个add()方法,该方法将更新父作用域中的集合,而无需在函数中显式限定它:
Function ListRunningServices
{
Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name |
ForEach-Object {$services.add($_)}
}
$services = New-Object collections.arraylist
ListRunningServices
$services
答案 1 :(得分:4)
功能块中的$services
范围限定为该函数。您可以执行以下操作:
Function ListRunningServices {
Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name
}
$services = ListRunningServices
$services
否则,您可以明确使用global:
来改变范围:
Function ListRunningServices {
$global:services = Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name
}
$services = @()
ListRunningServices
$services
答案 2 :(得分:3)
$函数范围内的服务与函数外部的服务无关。
尝试:
Function ListRunningServices
{
$services = @()
$services+= Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name;
return $services
}
$services = ListRunningServices
$services
保留您可以使用的大部分代码:
Function ListRunningServices
{
$global:services+= Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name;
}
$services = @();
ListRunningServices;
$services;
您可以阅读About_scope中的完整说明。
答案 3 :(得分:1)
Powershell要求在scope
个变量上指定array
前缀。似乎"正常String
"变量不是。像这样使用它们:
# Visible everywhere inside the script file (f.ex: myNameScript.ps1)
$script:names = @()
Function AddStringToArray ([string]$i_name) {
$script:names += $i_name
}
AddStringToArray -i_name "Markie"
AddStringToArray -i_name "Harry"
我知道这已经很晚了,但我希望这对至少有人有帮助。