尝试在函数中填充数组时无结果

尝试在函数中填充数组时无结果

我正在尝试使用一个函数来填充一个数组,其中包含计算机名称,以便传递给脚本的另一部分。我正在 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'

相关内容