簡體   English   中英

在java類路徑中轉義通配符處理

[英]escape wildcard processing in java classpath

由於通配符處理,下一個代碼打印當前目錄中每個文件的屬性。

c:\work>attrib *

我需要在腳本中禁用通配符處理。 逃生符號不起作用:

c:\work>attrib "*"
c:\work>attrib ^*

兩者都給你一樣的。

我需要禁用通配符處理來啟動我的接受通配符作為參數的應用程序。

A.java

import java.util.Arrays;

public class A {

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(args));
    }
}

CMD

C:\work\temp>start.bat

C:\work\temp>java -cp playground.jar A *
[activation.jar, file.txt, playground.jar, playground.jar.bak, start.bat, test.bat]

C:\work\temp>start.bat

C:\work\temp>java -cp playground.jar A "*"
[activation.jar, file.txt, playground.jar, playground.jar.bak, start.bat, test.bat]

C:\work\temp>start.bat

C:\work\temp>java -cp playground.jar A "* foo? *bar*"
[* foo? *bar*]

找到解決方法。 “*”; - 不是falid文件夾名稱,但有效的類路徑:

java -cp "*;" A

謝謝。

正如Ignacio Vazquez-Abrams已經指出的那樣,在Windows上,shell 不會進行通配符擴展 這取決於應用程序。 因此,你無法對shell做任何事情來阻止它做一些它首先沒做的事情。

> echoargs.exe *
arg 1: *

因此,如果應用程序中的參數以某種方式被破壞,那么它肯定不是shell的錯。

編輯:顯然Java“幫助”復制Unix行為並為您擴展所有通配符。 以上echoargs是用C#編寫的,這就是問題沒有顯示的原因。

好的,進一步的挖掘揭示了2004年的這個錯誤報告 。這是因為Java與不同版本的setargv ,如MSDN中所述 ,因此在命令行參數中擴展了通配符。 這發生在Java甚至看到參數之前,因為這是C運行時啟動代碼。

此外,就我所知,在任何地方都沒有記錄,上面鏈接的錯誤5036373甚至指出它應該記錄在案。 顯然,沒有解決這個問題。 即使它無法將文字通配符傳遞給Java程序。 顯然,Windows確實只是Java的二級目標,他們並不關心(或者它會破壞太多的程序,但我不確定有那么多明確依賴於這種行為)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM