2014-09-20 47 views
0

程序必須監視與掩碼匹配的文件。文件夾名稱和掩碼通過命令行參數傳遞。但即使在我可以使用它之前,面具也會被第一場比賽取代!雙引號也沒有效果,也沒有其他符號,例如我嘗試過使用\或'來保護輸入,然後這個符號將被添加到參數,而我不想要。任何想法如何解決它?Java命令行參數,停止擴展通配符符號

public static void main(String[] args) throws IOException { 
    File dir = new File(args[0]); 
    String mask = args[1]; 
    System.out.println(dir.getAbsolutePath()); 
    System.out.println(mask); 
    String regex = args[2]; 
    System.out.println(regex); 
} 

Regular expression from args[2] also replaced with some file from folder. 

Input: "E:\Programming\Java\Task7" *.??? ... 

Ouput: E:\Programming\Java\Task7 .git Task7.iml 

Input: "E:\Programming\Java\Task7" *.????* [a-zA-Z] 

Output: E:\Programming\Java\Task7 .idea [a-zA-Z] 

Input: "E:\Programming\Java\Task7" '.???' ... 

Output: E:\Programming\Java\Task7 '.???' ... 

Input: "E:\Programming\Java\Task7" \\'.???'\\ ... 

Output: E:\Programming\Java\Task7 \'.???'\ ... 

我知道使用引號或反斜槓並不是壞主意,但我認爲存在更好的方法。

回答

4

背景:在Linux上,擴展命令參數中的通配符不是Java。在java命令啓動之前,shell會執行

停止shell擴展通配符的方法是引用參數。你如何做到這一點取決於你正在使用的外殼。


現在對於Windows的情況......這是你真正問到的問題。

從我所讀到的,標準的「cmd.exe」shell(在它的各種版本/風味)不會做通配符擴展。應用程序需要在特定的基礎上進行擴展(或不擴展)。

顯然這對於​​Java「一次編寫,隨處運行」的哲學來說是有問題的,所以Java設計者試圖在命令行參數中使用通配符參數工作在Windows上,就像他們在Unix和Linux上一樣。但不幸的是,他們無法做到完美的工作...因此這種異常。

但是,根據this page,將雙引號放在參數的旁邊會告訴Java不進行通配符擴展。

但是,如果這沒有幫助,你可能運氣不好。


下面是有關這個主題的一些鏈接Oracle文檔,從Oracle的Java bug報告#5036373採取:在Windows平臺上

的Java通配符擴展已經被記錄在案。見 以下鏈接: http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

通配符擴展不爲 單個元素的classpath Windows命令外殼由於所描述的微軟漏洞工作。

的限制將在7u10發行說明中還提到: http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html

不過,我認爲甲骨文的員工是誰寫的,目前正在故意裝傻,因爲一般的通配符擴展顯然是沒有記錄在那些「手動」頁面中。他們只在-cp的論點中談論通配符擴展。

+0

我知道它不是擴展通配符的java,而且我通過雙引號或其他合適的符號(如\或'')保護輸入不起作用。順便說一下,我使用Windows cmd。 – 2014-09-20 12:33:52