Powershell数组范围;为什么我的数组是空的?

时间:2013-12-11 13:53:46

标签: arrays powershell powershell-v2.0

我希望有一个数组,并从我的脚本中的不同函数添加元素。我下面的例子说明了我可能误解了有关范围的问题。我目前的理解是,如果在函数外部定义了一个数组,然后在函数内部添加了元素,那么这些元素应该在函数外部可用。

Function ListRunningServices
{
    $services+= Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name;
}

$services = @();
ListRunningServices;
$services;

我在这里缺少什么?也许我的风格完全错了。

4 个答案:

答案 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"

我知道这已经很晚了,但我希望这对至少有人有帮助。