我正在創建一個 Java Swing應用程式,我從用戶那里獲取輸入,這些輸入將用作批處理檔案的引數。
按下按鈕后,我的批處理檔案應與用戶提供的引數一起以管理員模式啟動。
這是命令列:
powershell Start-Process -Verb runas cmd '/k System.getProperty("user.dir") batchFilePath arg1 "" arg2 "" arg3'
當我們將它粘貼到 CMD 視窗中時,該命令可以正常作業。
但我想要 Java 應用程式的代碼,以便我們可以從JButton. 所以我使用ArrayList并給出了這個ArrayList作為輸入,ProcessBuilder但我得到了一個錯誤。
代碼:
String launchCMD= System.getProperty("user.dir") batchFilePath arg1 "" arg2 "" arg3
final ArrayList<String> commands = new ArrayList<String>();
commands.add("powershell Start-Process -Verb runas cmd \'/k ")
commands.add(launchCMD)
commands.add("\'" );
ProcessBuilder pr=new ProcessBuilder(commands);
pr.start();
錯誤:
java.io.IOException: Cannot run program ... : CreateProcess error=2, The system cannot find the file specified
uj5u.com熱心網友回復:
您的問題與Swing并沒有真正的關系,它與如何使用ProcessBuilder類有關,并且該類不是終端仿真器。它不會決議您在 PowerShell 視窗中輸入的命令列。您需要將命令拆分為令牌。這就是ProcessBuilder建構式采用字串串列的原因。請注意,ProcessBuilder建構式的引數不必是字串文字。您可以以任何您喜歡的方式創建字串,并將其作為引數傳遞給ProcessBuilder建構式。
您沒有發布示例批處理檔案,所以我撰寫了一個自己的批處理檔案,命名showargs.bat它只是呼應了它的第一個引數。
@echo off
echo %1
對我有用的命令(即以管理員身份運行批處理檔案)是:
powershell.exe -Command Start-Process cmd.exe -ArgumentList '/k C:\Users\USER\showargs.bat Diego' -Verb RunAs
使用 class 執行上述命令的 Java 代碼ProcessBuilder:
ProcessBuilder pb = new ProcessBuilder("powershell.exe",
"-Command",
"Start-Process",
"cmd.exe",
"-ArgumentList",
"'/k C:\\Users\\USER\\showargs.bat Diego'",
"-Verb",
"RunAs");
try {
Process proc = pb.start();
int status = proc.waitFor();
System.out.println("status = " status);
}
catch (InterruptedException | IOException x) {
x.printStackTrace();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517993.html
