У меня есть командный файл, который принимает в качестве аргумента имя компьютера и удаленно устанавливает на него 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
статья всегда выполняется?