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

Powershell Foreach-Object с оператором if не работает - помогите!

У меня есть командный файл, который принимает в качестве аргумента имя компьютера и удаленно устанавливает на него Java JRE. Теперь я пытаюсь запустить этот сценарий Powershell, чтобы многократно вызывать командный файл и устанавливать Java в любой системе, которую он находит без последней версии. Кажется, что он работает без ошибок, но операторы внутри блока кода if никогда не запускаются - даже если условный тест if имеет значение true. Может ли кто-нибудь взглянуть на этот сценарий и указать, что мне, возможно, не хватает? Я использую командлеты Quest AD и модуль BSOnPosh. Спасибо.

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
 }
}

Хорошо, я немного повозился с этим, и он заработал. Сначала это выглядело так, как будто сценарий выполнялся, как ожидалось, за исключением того, что он отображал сообщение об ошибке в консоли всякий раз, когда команда reg query не находила искомый ключ reg. Само по себе это не было проблемой, но после этого я ожидал, что она продолжится и запустит if блок кода - вместо этого казалось, что он сразу переходит к обработке следующего объекта в foreach-object очередь из конвейера. Я не уверен, что там происходило, но в конце концов я довел код до такой степени, что он все правильно оценивал и пытался запустить if кодовый блок. На этот раз я получал следующую ошибку всякий раз, когда скрипт попадал в Out-Host заявление: Out-Host : A positional parameter cannot be found that accepts argument mystringvar. Видимо есть кое-что об использовании Out-Host что вызывает ForEach-Object думать, что блок кода обработки готов. Во всяком случае, я преодолел это, перейдя на использование Write-Output вместо. Вот окончательный рабочий код:

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
    }
}

Вы можете попробовать упростить if кому:

if($tststr -notmatch '1.6.0_20')

чтобы увидеть, помогает ли это, но я не вижу ничего явно неправильного, если только он никогда не оценивается как истина. Так что else статья всегда выполняется?