Powershell Foreach – 对象与if语句不工作 – 帮助!

我有一个batch file,它需要一个计算机名称作为它的参数,并远程安装Java JRE。 现在,我试图运行这个Powershell脚本来重复调用batch file,并在没有最新版本的任何系统上安装Java。 它似乎运行无错误,但if代码块内的语句似乎永远不会运行 – 即使if条件testing的计算结果为true。 任何人都可以看看这个脚本,并指出我可能失踪? 我正在使用Quest AD cmdlet和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命令没有find它正在查找的registry项时,它将在控制台中显示一条错误消息。 这本身并不是一个问题,但之后我会期待它继续并运行if代码块 – 相反,它似乎正在跳过处理pipe道中的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子句总是运行?