Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Powershell阵列范围;为什么我的数组是空的?_Arrays_Powershell_Powershell 2.0 - Fatal编程技术网

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

Arrays Powershell阵列范围;为什么我的数组是空的?,arrays,powershell,powershell-2.0,Arrays,Powershell,Powershell 2.0,我希望有一个数组,并从脚本中的不同函数向其中添加元素。下面的例子说明了我可能对范围有误解的地方。我目前的理解是,如果在函数外部定义数组,然后在函数内部添加元素,那么这些元素应该在函数外部可用 Function ListRunningServices { $services+= Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name; } $services = @(); ListRunningServices

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

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

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

我错过了什么?也许我的风格完全错了

$函数范围内的服务与函数外的服务无关

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

$services = @();
ListRunningServices;
$services;
尝试:

保留您可以使用的大部分代码:

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

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

您可以阅读中的完整说明。

功能块中的
$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

您可以使用全局变量来解决这个问题,但是使用全局变量通常被认为是不好的做法。如果使用泛型集合类型(如arraylist)而不是数组,则可以使用add()方法更新父范围中的集合,而无需在函数中显式限定其范围:

Function ListRunningServices
{
    Get-Service | ?{$_.Status -eq "Running"} | sort Name | select Name |
     ForEach-Object {$services.add($_)}
}

$services = New-Object collections.arraylist
ListRunningServices
$services

Powershell要求在
数组
变量上指定带有前缀的
范围
。似乎“normal
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"

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

我想从脚本中的许多不同函数添加到服务阵列中。哪一种是最好的练习方式?使用
$global
?如果可能,我会避免使用
$global:
。是否有原因不能将
$services
作为参数提供给其他功能?这可能有助于了解您打算如何使用其他功能与
$services
交互。只需测试您发布的$global解决方案,它不会产生任何输出。我只是将第二个示例复制/粘贴到一个新的PS会话中,它会产生与第一个示例相同的输出。有趣的是,如果我粘贴到Powershell窗口中,它会工作,但是如果我保存到一个文件中,然后使用.\file.ps1将该文件作为脚本调用,则不会得到任何输出。