Não há resultados ao tentar preencher uma matriz em uma função

4

Estou tentando usar uma função para preencher uma matriz com nomes de computador para passar para outra parte de um script. Estou pingando todos os nomes de computadores em uma unidade organizacional e, quando voltarem como on-line, gostaria de adicioná-los a uma matriz. No entanto, sempre que executo a função, ela retorna sem nenhum nome de computador.

Se eu percorrer a função manualmente, ela funciona bem. Aqui está o código:

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 += $_

}
}
}

A execução dessa função não preenche a matriz.

Então, isso me fornece todos os nomes de computador na unidade organizacional:

$machines = (Get-AdComputer -SearchBase $OU -Filter *).name

A execução desta peça obtém as máquinas on-line e preenche a matriz sem problemas:

$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
Espero que isso seja algo estúpido da minha parte, mas não consigo entender por que isso não vai funcionar do jeito que estou esperando. Qualquer ajuda seria ótima!

Obrigado Drew

    
por Drew 06.11.2015 / 16:23

1 resposta

4

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'
    
por 06.11.2015 / 16:36

Tags