[英]Evaluation of environment variables in command run by Java's Runtime.exec()
我有一個場景,我有一個Java“代理”,可以在幾個平台(特別是Windows,Solaris和AIX)上運行。 我想通過在我執行的命令行中使用環境變量來分解文件系統結構的差異。
據我所知,沒有辦法讓Runtime.exec()
方法解析/評估命令String(或字符串數組)中引用的任何環境變量。
我知道如果push推進,我可以編寫一些代碼來預處理命令String(s)並手動解析環境變量(使用getEnv()
等)。 但是我想知道是否有一種更聰明的方法可以做到這一點,因為我確信我不是唯一一個想要這樣做的人,而且我確信在“敲定”我自己的實現方面存在缺陷。
非常歡迎您的指導和建議。
編輯:我想使用一些一致的表示法(如$ VAR和/或%VAR%)來引用命令字符串中的環境變量。 不討厭哪個。
編輯:要清楚我希望能夠執行如下命令:
perl $SCRIPT_ROOT/somePerlScript.pl args
在Windows和Unix主機上使用Runtime.exec()
。 我在配置文件中指定了一個描述要運行的作業列表的命令,它必須能夠跨平台工作,因此我認為環境變量對於分解文件系統差異很有用( /home/username/scripts
vs C:\\foo\\scripts
)。 希望有助於澄清它。
謝謝。 湯姆
我想我用原來的答案誤解了你的問題。 如果您嘗試在使用with-in Java生成的命令行上解析環境變量引用,我認為您可能需要“自己動手”。
根據操作系統的不同,有很多不同的標准可以擴展它們。 另外,這通常是shell的功能,因此即使在相同的OS上也可能有不同的方式。 實際上,標准操作系統進程激活函數(例如Unix中的exec
)不進行命令行擴展。
使用Java 5及更高版本時,這確實不是那么困難。 為自己定義標准,我通常使用您在安全策略文件中看到的Java標准和一些增強的屬性文件定義 - ${var}
擴展為變量/屬性名稱引用。 就像是:
private static String expandCommandLine(final String cmd) {
final Pattern vars = Pattern.compile("[$]\\{(\\S+)\\}");
final Matcher m = vars.matcher(cmd);
final StringBuffer sb = new StringBuffer(cmd.length());
int lastMatchEnd = 0;
while (m.find()) {
sb.append(cmd.substring(lastMatchEnd, m.start()));
final String envVar = m.group(1);
final String envVal = System.getenv(envVar);
if (envVal == null)
sb.append(cmd.substring(m.start(), m.end()));
else
sb.append(envVal);
lastMatchEnd = m.end();
}
sb.append(cmd.substring(lastMatchEnd));
return sb.toString();
}
正則表達式
[$]\\{(\\S+)\\}
貪婪( S+
)並且在xx ${a} xx ${b} xx
,它將匹配A} xx ${B
而不是單獨的A
和B
你有沒有在cmd中使用多個變量進行測試?
因此,如果有多個變量需要替換。 它應該是
[$]\\{(\\S+?)\\}
是否有一些原因系統屬性不起作用? 在命令行上使用-D標志,然后可以通過System.getProperty檢索它
僅僅因為我的剪貼板中的Windows環境變量解析代碼(由你的真實編碼)對字符串起作用,我只想在這里發布。 這可能是最有效的方法(也許正則表達式效率低得多,我不確定)。
int from = 0;
int startperc = -1;
int endperc = -1;
while (true) {
int index = tok.indexOf("%", from);
if (index == -1) break;
if (startperc == -1) {
startperc = index;
} else if (endperc == -1) {
endperc = index;
}
from = index + 1;
if (startperc >= 0 && endperc > startperc) {
String startbit = tok.substring(0, startperc);
String middlebit = System.getenv(tok.substring(startperc + 1, endperc));
String endbit = endperc <= tok.length() ? tok.substring(endperc + 1) : ""; // substr up to end
// integrate
tok = startbit + middlebit + endbit;
// reset
startperc = -1;
endperc = -1;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.