Powershell Foreach-Object 的 if 语句不起作用 - 救命!

Powershell Foreach-Object 的 if 语句不起作用 - 救命!

我有一个批处理文件,它以计算机名称作为参数,并将远程安装 Java JRE。现在,我尝试运行此 Powershell 脚本来重复调用批处理文件并在它找到的任何没有最新版本的系统上安装 Java。它似乎运行无错误,但 if 代码块内的语句似乎从未运行 - 即使 if 条件测试的计算结果为真。有人可以看看这个脚本并指出我可能遗漏了什么吗?我正在使用 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
 }
}

答案1

好的,所以我对这个做了一些修改并让它工作了。起初,脚本似乎按预期运行,只是每当 reg query 命令找不到它正在寻找的 reg 键时,它都会在控制台中显示一条错误消息。这本身并不是问题,但在那之后,我本以为它会继续运行代码块if- 相反,它似乎直接跳过了处理foreach-object管道队列中的下一个对象。我不确定那里发生了什么,但最终我让代码到了正确评估所有内容并尝试运行if代码块的地步。这次,每当脚本遇到语句时,我都会收到以下错误Out-HostOut-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
    }
}

答案2

您可以尝试简化if为:

if($tststr -notmatch '1.6.0_20')

看看这是否有帮助,但我认为没有什么明显错误,除非它从未真正被评估为真。所以该else子句总是运行?

相关内容