Rammj
Rammj

Reputation: 121

Invoke Powershell scripts from Java

I want to invoke my powershell script from java. Can it be done. I tried with the following code, but the stream is not closing.

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();
    }

}

Does java invoke a powershell script which performs create remote session and execute cmdlets?

Do we have support to invoke powershell scripts in java?

Anyone could you please help on this.

Awaiting for your responses.

Thanks, rammj

Upvotes: 12

Views: 39309

Answers (3)

profesor_falken
profesor_falken

Reputation: 559

Now you can do it easily with jPowerShell

powerShell = PowerShell.openSession();

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

powerShell.close();

Upvotes: 7

SANN3
SANN3

Reputation: 10069

Yes we can create remote session and execute cmdlets using powershell script.

Save the following Power shell script to 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  

Java Code :

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();
        }

If you do not get output, try this: powerShellProcess.getErrorStream() instead powerShellProcess.getInputStream(). It will show the errors.

Upvotes: 5

manojlds
manojlds

Reputation: 301147

After starting the process ( runtime.exec() ), add a line to close the input stream of the process ( which JAVA calls output stream!!):

 proc.getOutputStream().close();

Upvotes: 8

Related Questions