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