Ускорить обработку подстановочных знаков в java classpath

Следующий код печатает атрибуты каждого файла в текущем каталоге из-за обработки подстановочных знаков.

c:\work>attrib *

Мне нужно отключить обработку подстановочных знаков в моем script. Символы Escape не работают:

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));
    }
}

ЦМД

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*]

Обнаружено обходное решение. "*"; - неверное имя папки, но действительный путь к ней:

java -cp "*;" A

Спасибо.

Ответы

Ответ 1

Как уже отмечает Игнасио Васкес-Абрамс, в Windows оболочка не выполняет подстановочные расширения. Это до приложения. Таким образом, вы ничего не можете сделать с оболочкой, чтобы остановить ее от выполнения чего-то, чего она не делает в первую очередь.

> echoargs.exe *
arg 1: *

Итак, если аргументы в вашем приложении каким-то образом повреждены, то это определенно не ошибка оболочки.

EDIT: Очевидно, что Java "помогает" копирует поведение Unix и расширяет для вас все подстановочные знаки. Выше echoargs было написано на С#, поэтому проблема не была показана.

Хорошо, дальнейшее копание показывает этот отчет об ошибках с 2004 года. Это связано с тем, что Java была связана с другой версией setargv, как описано здесь, в MSDN и, таким образом, расширяет подстановочные знаки в аргументах командной строки. Это происходит до того, как Java даже увидит аргументы, потому что это код запуска C.

Кроме того, это не документировано нигде, насколько я мог найти, ошибка 5036373, связанная выше, даже отмечает, что она должна быть документирована. По-видимому, нет никаких оснований для этого. Несмотря на то, что это делает невозможным передачу буквенного шаблона Java-программам. По-видимому, Windows действительно является лишь второстепенной целью для Java, и им все равно (или она сломает слишком много программ, но я не уверен, что многие из них явно полагаются на это поведение).