2014-09-20 8 views
0

Программа должна следить за файлами, которые соответствуют маске. Имя папки и маска передаются через аргументы командной строки. Но маска заменяется первым матчем даже до того, как я смогу его использовать! Двойные кавычки не имеют эффекта и другие символы, например, я попробовал usind \ или ', чтобы защитить вход, но тогда этот символ будет добавлен в args, чего я не хочу. Любая идея, как это исправить?Аргументы командной строки 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.

Способ остановить оболочку от расширения подстановочных знаков - это привести аргументы. Как вы это делаете, это зависит от используемой оболочки.


Теперь для случая с Windows ... о чем вы действительно спрашиваете.

Из того, что я прочитал, стандартная оболочка «cmd.exe» (в различных вариантах/вариантах) НЕ делает расширение подстановочных знаков. Приложению предоставляется расширение (или нет) на разовой основе.

Очевидно, что это проблематично для философии «писать один раз, бегать везде», поэтому разработчики Java пытались сделать wild-cards в аргументах командной строки в Windows, как в Unix и Linux. Но, к сожалению, они не могут сделать идеальную работу ... отсюда эта аномалия.

Однако, согласно this page, помещение двойных кавычек вокруг аргумента говорит Java о том, чтобы не расширять wild-card.

Но если это не поможет, вам, вероятно, не повезло.


Вот некоторые ссылки на документацию Oracle по этой теме, взятые из отчета об ошибке Oracle Java #5036373:

Java расширение Wildcard на платформе Windows, было документально подтверждено. См следующих ссылок:

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

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

расширение Wildcard не работает в командной оболочке Windows, для одного элемента из-за классы жука Microsoft, описанным в: http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken.

Ограничения также упоминаются в примечаниях к выпуску 7u10: http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html

Однако, я думаю, что сотрудник Oracle, который писал, что был быть намеренно тупые, потому что расширение подстановочные в целом явно не документированы в тех "ручных" страницах.Они говорят только о расширении подстановок в аргументе -cp.

+0

Я знаю, что это не java, который расширяет подстановочные знаки, и я написал, что защита ввода осуществляется с помощью двойных кавычек или если подходящие символы типа \ или 'не работают. Кстати, я умуг Windows cmd. –