2011-11-16 16 views
12

Chcę wywołać mój skrypt powłoki powershell z języka Java. Czy można to zrobić. Próbowałem z następującym kodem, ale strumień się nie zamyka.Wywoływanie skryptów Powershell z Java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

public class TestPowershell { 

    public static void main(String[] args) throws IOException 
    { 
     Runtime runtime = Runtime.getRuntime(); 
     Process proc = runtime.exec("powershell C:\\testscript.ps1"); 
     InputStream is = proc.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader reader = new BufferedReader(isr); 
     String line; 
     while ((line = reader.readLine()) != null) 
     { 
      System.out.println(line); 
     } 
     reader.close(); 
     proc.getOutputStream().close(); 
    } 

} 

Czy java wywołuje skrypt typu powershell, który wykonuje tworzenie zdalnych sesji i wykonywanie poleceń cmdlet?

Czy mamy wsparcie do wywoływania skryptów powershell w języku Java?

Ktoś mógłby pomóc w tym.

Oczekiwanie na Twoje odpowiedzi.

Dzięki, rammj

+0

Czy otrzymujesz wyjątek? Powinieneś mieć swoje metody close() w końcu {}. –

+2

Przeczytaj to pierwsze http://kylecartmell.com/?p=9 – artbristol

Odpowiedz

8

Po uruchomieniu procesu (runtime.exec()), dodać linię, aby zamknąć strumień wejściowy procesu (co JAVA zwraca strumień wyjściowy !!):

proc.getOutputStream().close(); 
4

Yes We może tworzyć zdalną sesję i wykonywać polecenia cmdlet używając skryptu powershell.

Zapisz poniższy skrypt Zasilanie testscript.ps1

#Constant Variables 
$Office365AdminUsername="YOUR_USERNAME" 
$Office365AdminPassword="TOUR_PASSWORD" 

#Main 
Function Main { 
#Remove all existing Powershell sessions 
    Get-PSSession | Remove-PSSession 

#Encrypt password for transmission to Office365 
    $SecureOffice365Password = ConvertTo-SecureString -AsPlainText $Office365AdminPassword -Force 


#Build credentials object 
    $Office365Credentials = New-Object System.Management.Automation.PSCredential $Office365AdminUsername, $SecureOffice365Password 
Write-Host : "Credentials object created" 

#Create remote Powershell session 
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $Office365credentials -Authentication Basic –AllowRedirection 
Write-Host : "Remote session established" 

#Check for errors 
if ($Session -eq $null){ 
    Write-Host : "Invalid creditials" 
}else{ 
    Write-Host : "Login success" 
    #Import the session 
     Import-PSSession $Session 
} 

#To check folder size 
Get-MailboxFolderStatistics "YOUR_USER_NAME" | Select Identity, FolderAndSubfolderSize 

exit 
} 

# Start script 
. Main 

kod Java:

try { 
      String command = "powershell.exe \"C:\\testscript.ps1\""; 
      ExecuteWatchdog watchdog = new ExecuteWatchdog(20000); 
      Process powerShellProcess = Runtime.getRuntime().exec(command); 
      if (watchdog != null) { 
       watchdog.start(powerShellProcess); 
      } 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream())); 
      String line; 
      System.out.println("Output :"); 
      while ((line = stdInput.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

Jeśli nie dostać wyjście, spróbuj tego: powerShellProcess.getErrorStream() zamiast powerShellProcess.getInputStream(). Pokaże błędy.

4

Teraz można to zrobić łatwo z jPowerShell

powerShell = PowerShell.openSession(); 

//Print results  
System.out.println(powerShell.executeScript("\"C:\\testscript.ps1\"").getCommandOutput()); 

powerShell.close(); 
+0

Nie powinieneś kopiować i wklejać odpowiedzi na wiele pytań. –

Powiązane problemy