Powershell Foreach-Object com a instrução if não está funcionando - ajuda!

1

Eu tenho um arquivo em lotes que usa o nome de um computador como argumento e instala o Java JRE nele remotamente. Agora, estou tentando executar este script Powershell para chamar repetidamente o arquivo em lotes e instalar o Java em qualquer sistema que ele encontre sem a versão mais recente. Parece ser executado sem erros, mas as instruções dentro do bloco de código if nunca parecem ser executadas - mesmo quando o teste condicional if é avaliado como true. Alguém pode olhar para este roteiro e apontar o que eu estou perdendo? Estou usando os cmdlets do Quest AD e o módulo BSOnPosh. Obrigado.

get-qadcomputer -sizelimit 0 -name mypc* -searchroot 'OU=MyComputers,DC=MyDomain,DC=lcl'| test-host -property name |ForEach-Object -process {
$targnm = $_.name
$tststr=reg query "\$targnm\HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" /v Java6FamilyVersion
 if(-not ($tststr | select-string -SimpleMatch '1.6.0_20'))
 {
  $mssg="Updating to JRE 6u20 on $targnm"
  Out-Host $mssg
  Out-File -filepath c:\install_jre_log.txt -inputobject $mssg -Append
  cmd /c \server\apps\java\installjreremote.cmd $targnm
 }
 else
 {
  $mssg ="JRE 6u20 found on $targnm"
  Out-Host $mssg
  Out-File -filepath c:\install_jre_log.txt -inputobject $mssg -Append
 }
}
    
por Dmart 01.05.2010 / 09:05

2 respostas

2

OK, então eu tenho mexido com esse aqui um pouco e consegui trabalhar. No início, parecia que o script estava sendo executado conforme o esperado, exceto que mostraria uma mensagem de erro no console sempre que o comando reg query não encontrasse a chave reg que estava procurando. Isso em si não era um problema, mas depois disso eu esperava que continuasse e executasse o bloco de código if - em vez disso, ele parecia estar pulando direto para o processamento do próximo objeto na fila foreach-object do pipeline. Eu não tenho certeza do que estava acontecendo lá, mas eventualmente consegui o código no ponto em que ele estava avaliando tudo corretamente e tentando executar o bloco de código if . Desta vez, eu estava recebendo o seguinte erro sempre que o script atingia uma instrução Out-Host : Out-Host : A positional parameter cannot be found that accepts argument mystringvar . Aparentemente, há algo sobre o uso de Out-Host que faz com que ForEach-Object pense que o bloco de código de processamento está pronto. De qualquer forma, eu superei isso mudando para usar Write-Output . Aqui está o código final de trabalho:

import-module bsonposh
add-pssnapin Quest.ActiveRoles.ADManagement

get-qadcomputer -sizelimit 0 -searchroot 'OU=MyComputers,DC=MyDomain,DC=lcl' | test-host -property name |ForEach-Object -process {
    $targnm = $_.name
    $tststr=(reg query "\$targnm\HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" /v Java6FamilyVersion)
    if(-not($tststr |select-string -simplematch '1.6.0_20'))
    {
        $mssg="Updating to JRE 6u20 on $targnm"
        Write-Output $mssg
        Out-File -filepath c:\install_jre_log.txt -inputobject $mssg -Append
        cmd /c \myfileserver\apps\java\installjreremote.cmd $targnm
    }
    else
    {
        $mssg ="JRE 6u20 found on $targnm"
        Write-Output $mssg
        Out-File -filepath c:\install_jre_log.txt -inputobject $mssg -Append
    }
}
    
por 03.05.2010 / 21:25
0

Você pode tentar simplificar o if para:

if($tststr -notmatch '1.6.0_20')

para ver se isso ajuda, mas não vejo nada obviamente errado a menos que ele nunca esteja realmente sendo avaliado como verdadeiro. Então a cláusula else é sempre executada?

    
por 01.05.2010 / 09:50