O escopo de $computers
e $machines
está limitado à função Return-OnlinePCsInOu
. Quando a função sai, eles não estão mais no escopo. Também sua função não produz saída, então nada é "retornado". Quando você executa os comandos diretos no shell / ISE, as variáveis estão no escopo da sessão atual e você pode usá-las.
Você pode assistir isso adicionando uma saída simples:
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
Como você não usa as variáveis $computer
ou $machine
para nada além de criar as matrizes, eu pularia usando todas elas juntas. A função pode produzir a saída desejada diretamente e você pode coletá-la em uma variável.
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'