不同控制台中的PowerShell脚本行为不同

时间:2017-09-08 14:54:27

标签: java powershell dcom windows-update

所以我在java中编写Windows update'r automat。为了从Windows服务器获取所需的数据,我正在使用jPowerShell,并且在执行此脚本时我有一个奇怪的问题

Java调用PowerShell脚本

PowerShell ps = PowerShell.openSession();
        PowerShellResponse response;
        response = ps.executeScript("C:\\Users\\Prezes\\Desktop\\IsUpdateToInstal.ps1");
        System.out.println(response.getCommandOutput());

PowerShell脚本

$pw = ConvertTo-SecureString 'password' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -argumentList domein\login, $pw
Enter-PSSession -ComputerName IP -Credential $cred
$UpdateSession = [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session")) 
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()             
$SearchResult = $UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0")
            $Critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
                $important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
                $other = $SearchResult.updates | where { $_.MsrcSeverity -eq $nul}
                $totalUpdates = $($SearchResult.updates.count)
                if($totalUpdates -gt 0)
                {
                    $updatesToInstall = $true
                }
                else { $updatesToInstall = $false }
$other
$totalUpdates
$updatesToInstall

如果我在PowerShell标准consol中逐行执行此脚本,则每个工作正常并返回正确的值。 但是,当我逐行在PowerShell ISE中运行此脚本或由Java运行时,我发现此行有一些问题

$UpdateSession = [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session")) 

当我进入这一行并按下回车时我可以在ISE中看到“已经运行了一个命令,请等待”当我等待一分钟时,通信是一样的并且没有任何改变但是当我按下输入secound time命令立即通过时。如果从他们现在我运行其余的脚本,继续我运作良好。

当我尝试在ISE中执行完整脚本时,我发现此错误

    Exception form HRESULT: 0x80072EE2
At C:\Users\Prezes\Desktop\IsUpdateToInstal.ps1:6 char:1
+ $SearchResult = $UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 a ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMExceptio

Java给我null,说我无法运行对象为$ UpdateSearcher的null对象

我很早就开始使用PowerShell和我正在使用的脚本是纯粹的形式,在谷歌中找到了一些例子。

1 个答案:

答案 0 :(得分:0)

所以我还没弄清楚造成奇怪行为的原因是什么,但我设法通过java中的PowerShell api编写了一些开始为我工作的东西并获得了返回值。

    $pw = ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force
   $cred = New-Object -TypeName System.Management.Automation.PSCredential -argumentList 792\opmanager, $pw
$TotalUpdates = Invoke-Command -ComputerName IP -ScriptBlock{
$UpdateSession = [activator]::CreateInstance([type]::GetTypeFromProgID("Microsoft.Update.Session")) 
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()             
$SearchResult = $UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0")
            $Critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
                $important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
                $other = $SearchResult.updates | where { $_.MsrcSeverity -eq $nul}
                $totalUpdates = $($SearchResult.updates.count)
                if($totalUpdates -gt 0)
                {
                    $updatesToInstall = $true
                }
                else { $updatesToInstall = $false }
Return $totalUpdates
} -Credential $cred
$TotalUpdates