簡體   English   中英

Java Runtime.exec()不返回PowerShell命令輸出

[英]Java Runtime.exec() not returning PowerShell command output

我正在使用Java調用PowerShell命令,然后捕獲輸出。

我遇到了一個問題,其中一個簡單的PowerShell命令將返回輸出,而另一個則不會,並且我試圖理解原因。

這是邏輯 (已更新為包括對錯誤輸出流的檢查)

public class Example {

  private void myMethod(String command) throws IOException {
       Process process = Runtime.getRuntime().exec(command);
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

       String output = "";
       String line;
       while((line = bufferedReader.readLine()) != null){
        output += (line + "\n");
       }

       System.out.println((output.isEmpty() ? "No output was received!!!" : output));

       // Also iterate through the error stream to see if it caught anything.
       BufferedReader errorBufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
       String errorOutput = "";
       while((line = errorBufferedReader.readLine()) != null){
        errorOutput += (line + "\n");
       }

       System.out.println((errorOutput.isEmpty() ? "Nothing in the error output stream." : errorOutput));
  }


   public static void main(String[] args) throws IOException {
       new Example().myMethod("powershell -Command \"$PSVersionTable\"");
       new Example().myMethod("powershell -Command \"Get-Module -Name VMware* -ListAvailable\"");
   }
}

這是輸出

Name                           Value                                                                                                                                                                   
----                           -----                                                                                                                                                                   
PSVersion                      5.0.10586.117                                                                                                                                                           
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                                                 
BuildVersion                   10.0.10586.117                                                                                                                                                          
CLRVersion                     4.0.30319.18444                                                                                                                                                         
WSManStackVersion              3.0                                                                                                                                                                     
PSRemotingProtocolVersion      2.3                                                                                                                                                                     
SerializationVersion           1.1.0.1                                                                                                                                                                 

Nothing in the error output stream.
No output was received!!!
Nothing in the error output stream.

因此,在Main()執行的第一個命令返回輸出,但是第二個命令卻沒有,我也不明白為什么。

我可以通過命令提示符手動運行第二個命令,它肯定可以工作。

關於為什么我以編程方式執行第二個命令的輸出時無法檢索到第二個命令的想法?

更新資料

手動運行第二個命令時,這是生成的輸出(以及我期望捕獲的Java代碼)

U:\>powershell -Command "Get-Module -Name VMware* -ListAvailable"


Directory: C:\Program Files\WindowsPowerShell\Modules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     6.5.1.6... VMware.DeployAutomation             {Add-DeployRule, Add-ProxyServer, Add-ScriptBundle, Copy-DeployRule...}
Binary     6.5.1.6... VMware.ImageBuilder                 {Add-EsxSoftwareDepot, Add-EsxSoftwarePackage, Compare-EsxImageProfile, Export-EsxImageProfile...}
Manifest   6.5.4.7... VMware.PowerCLI
Binary     6.5.4.6... VMware.VimAutomation.Cis.Core       {Connect-CisServer, Disconnect-CisServer, Get-CisService}
Binary     6.5.1.5... VMware.VimAutomation.Cloud          {Add-CIDatastore, Connect-CIServer, Disconnect-CIServer, Get-Catalog...}
Manifest   6.5.4.6... VMware.VimAutomation.Common
Binary     6.5.2.6... VMware.VimAutomation.Core           {Add-PassthroughDevice, Add-VirtualSwitchPhysicalNetworkAdapter, Add-VMHost, Add-VMHostNtpServer...}
Binary     6.5.4.7... VMware.VimAutomation.HA             Get-DrmInfo
Binary     7.1.0.5... VMware.VimAutomation.HorizonView    {Connect-HVServer, Disconnect-HVServer}
Binary     6.5.1.5... VMware.VimAutomation.License        Get-LicenseDataManager
Binary     2.0.0.6... VMware.VimAutomation.Nsxt           {Connect-NsxtServer, Disconnect-NsxtServer, Get-NsxtService}
Binary     6.5.1.5... VMware.VimAutomation.PCloud         {Connect-PIServer, Disconnect-PIServer, Get-PIComputeInstance, Get-PIDatacenter}
Manifest   1.0.0.5... VMware.VimAutomation.Sdk            {Get-PSVersion, Get-InstallPath}
Binary     6.5.1.5... VMware.VimAutomation.Srm            {Connect-SrmServer, Disconnect-SrmServer}
Binary     6.5.4.7... VMware.VimAutomation.Storage        {Add-KeyManagementServer, Copy-VDisk, Export-SpbmStoragePolicy, Get-KeyManagementServer...}
Script     1.1        VMware.VimAutomation.StorageUtility Update-VmfsDatastore
Binary     6.5.1.5... VMware.VimAutomation.Vds            {Add-VDSwitchPhysicalNetworkAdapter, Add-VDSwitchVMHost, Export-VDPortGroup, Export-VDSwitch...}
Binary     6.5.4.7... VMware.VimAutomation.Vmc            {Connect-Vmc, Disconnect-Vmc, Get-VmcService, Connect-VmcServer...}
Binary     6.5.1.5... VMware.VimAutomation.vROps          {Connect-OMServer, Disconnect-OMServer, Get-OMAlert, Get-OMAlertDefinition...}
Binary     6.5.1.5... VMware.VumAutomation                {Add-EntityBaseline, Copy-Patch, Get-Baseline, Get-Compliance...}

所以我弄清楚了這里發生了什么。

快速回顧問題::

  • 我已經通過PowerShell庫手動安裝了一些VMWare模塊。
  • 我試圖以編程方式檢索我已安裝的所有可用VMware模塊的列表。
  • 我沒有任何標准輸出或錯誤輸出。

發生這種情況的原因::

  • 我已經通過64位Powershell安裝了VMWare模塊。
  • 我的Java程序在32位JDK上運行。
  • 因此,當Java打開cmd提示時,它正在打開32位cmd提示,而該提示又調用了32位Powershell。
  • 我沒有為32位Powershell安裝VMWare模塊,這就是為什么當我嘗試以編程方式檢索所有可用VMWare模塊的列表時沒有得到任何輸出的原因。
  • 當我手動運行命令以檢索所有可用VMWare模塊的列表時,我使用的是64位Powershell(已為其安裝了VMWare模塊)

通過32位Powershell安裝VMware模塊之后,我的Java程序(在32位上下文中運行)開始按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM