Назад | Перейти на главную страницу

Нет результатов при попытке заполнить массив в функции

Я пытаюсь использовать функцию для заполнения массива именами компьютеров, чтобы передать их другой части скрипта. Я проверяю все имена компьютеров в 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

Я надеюсь, что это что-то глупое с моей стороны, но я не могу понять, почему это не сработает так, как я надеюсь. Любая помощь была бы замечательной!

Спасибо, Дрю

Объем обоих $computers и $machines ограничивается функцией Return-OnlinePCsInOu. Когда функция завершается, они больше не входят в область видимости. Также ваша функция не производит никакого вывода, поэтому ничего не «возвращается». Когда вы запускаете команды непосредственно в оболочке / 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'