我正在尝试使用一个函数来填充一个数组,其中包含计算机名称,以便传递给脚本的另一部分。我正在 ping OU 中的所有计算机名称,当它恢复在线状态时,我想将其添加到数组中。但是,每当我运行该函数时,它都会返回根本没有计算机名称。
如果我手动执行该函数,它会正常工作。以下是代码:
Function Return-OnlinePCsInOU {
[cmdletbinding()]
param([Parameter(Mandatory=$true)]
[String]$OU
)
$computers = @()
$machines = (Get-AdComputer -SearchBase $OU -Filter *).name
$machines | Foreach {
If (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
$computers += $_
}
}
}
运行此函数不会填充数组。
通过逐步操作,我可以得到 OU 中的所有计算机名称:
$machines = (Get-AdComputer -SearchBase $OU -Filter *).name
运行此部分可获得在线机器并填充数组,没有问题:
$machines | Foreach {
If (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
$computers += $_
}
}
PS C:\> $computers
71832
72098
83547
77437
77216
83427
81276
73293
71754
81308
67332
71765
我希望这只是我的愚蠢之举,但我不明白为什么它不能像我希望的那样工作。任何帮助都非常感谢!
谢谢,德鲁
答案1
$computers
和的作用域$machines
都限于函数Return-OnlinePCsInOu
。当函数退出时,它们不再在作用域内。此外,您的函数不会产生任何输出,因此不会“返回”任何内容。当您在 shell/ISE 中直接运行命令时,变量在当前会话的范围内,并且您可以使用它们。
您可以通过添加一些简单的输出来观察这一点:
Function Return-OnlinePCsInOU {
[cmdletbinding()]
param([Parameter(Mandatory=$true)] [String] $OU)
$computers = @()
$machines = (Get-AdComputer -SearchBase $OU -Filter *).name
"Found: $machines" # writes search results
$machines | Foreach {
If (Test-Connection -ComputerName $_ -Count 1 -Quiet) {
"Pinged $_" # writes when ping works
$computers += $_
}
}
}
Return-OnlinePCsInOU
$computers # no output
$machines # no output
由于您不使用变量,$computer
或者$machine
除了构建数组之外不做任何其他事情,因此我将跳过使用它们。该函数可以直接生成所需的输出,您可以将其收集到变量中。
Function Return-OnlinePCsInOU {
[cmdletbinding()]
param([Parameter(Mandatory=$true)] [String] $OU)
Get-AdComputer -SearchBase $OU -Filter * |
Foreach {
If (Test-Connection -ComputerName $_.Name -Count 1 -Quiet) {
$_.Name
}
}
}
# Scope is outside function, collect the output here.
$onlineComputers = Return-OnlinePCsInOU 'DC=example,DC=org'