Прекратить расширение символов подстановки в аргументах командной строки для 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);
}

Регулярное выражение от args[2] также заменен некоторым файлом из папки.

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 \'.???'\ ...

Я понимаю, что использование цитаты или обратной косой черты не такая уж плохая идея, но я думаю, что существует лучший способ.

2 ответа

Решение

Предыстория: в Linux не Java расширяет символы подстановки в аргументах команды. Оболочка делает это до того, как java команда запущена.

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


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

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

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

Однако, согласно этой странице, размещение двойных кавычек вокруг аргумента говорит Java, что не нужно расширять символы подстановки.

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


Вот несколько ссылок на документацию 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

Расширение с подстановочными знаками не работает в командной оболочке 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 аргумент.

Помимо возможности, приведя аргументы, которые не следует расширять, есть еще одна возможность. Вы можете использовать файл аргументов командной строки. Подстановочные знаки в параметрах, которые там указаны, не раскрываются.

По крайней мере, здесь так описано: https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 . См. там раздел «Файлы аргументов командной строки java».

Средство запуска не расширяет подстановочные знаки, присутствующие в файле аргументов.

Другие вопросы по тегам