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

Posted

技术标签:

【中文标题】不同控制台中的不同 PowerShell 脚本行为【英文标题】:Different PowerShell script behavior in different console 【发布时间】:2017-09-08 14:54:27 【问题描述】:

所以我用 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 标准控制台中逐行执行此脚本,则一切正常并返回正确的值。 但是当我在 PowerShell ISE 中逐行运行此脚本或通过 Java 运行时,我注意到这一行存在一些问题

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

当我输入此行并按 Enter 时,我可以在 ISE 中看到“已经在运行命令,请稍候”,当我等待几分钟时,通信是相同的,没有任何变化,但是当我按 Enter 时,第二时间命令立即通过。如果现在我从他们那里运行其余的脚本,我工作得很好。

当我尝试在 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 的早期初学者,我正在使用的脚本是纯形式的,在谷歌中找到了一些示例。

【问题讨论】:

Java程序在什么账户下执行? 我的 Domein 帐户 Windows 10 家庭高级版 你能在另一台电脑上成功运行脚本吗? 星期一会测试 $UpdateSearcher = $UpdateSession.CreateUpdateSearcher() 这行返回什么?如果它返回任何东西,请显示它返回什么$UpdateSearcher | get-member 【参考方案1】:

所以我还没有弄清楚奇怪行为的原因是什么,但我设法编写了一些东西,通过 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

【讨论】:

以上是关于不同控制台中的不同 PowerShell 脚本行为的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell 中的类似 GetOpt 的行为

Powershell Here String 中换行在不同版本中的行为表现

如何测量 powershell 脚本中不同功能的持续时间(以秒为单位)?

在 C# 中使用不同的凭据调用远程 powershell 脚本

在 CMD 和 PowerShell 中管道时的不同行为和输出

在 CMD 和 PowerShell 中管道时的不同行为和输出