Расширение *. * При передаче в качестве аргумента exe в пакетном файле Windows - PullRequest
1 голос
/ 05 января 2011

Я пишу командный файл в Windows XP. Я скопировал набор *.ts файлов в каталог моего exe. Количество файлов TS не фиксировано, так как их имена.

Теперь я хочу запустить один из моих exe-файлов, который будет принимать все имена TS в качестве аргумента.

В Linux я пробовал как <MyExeName> *.ts

Это сработало. Но когда я делаю то же самое в Windows, он не расширяет *.ts.

Пожалуйста, дайте мне знать, как я могу расширить *.ts, передавая аргументы моему exe.

Ответы [ 3 ]

1 голос
/ 05 января 2011

Вы можете использовать цикл FOR-LUM для перечисления всех файлов * .ts, например

for %%f in (*.ts) do echo %%f
1 голос
/ 05 января 2011

Оболочка Windows (командный процессор) никогда не выполняет глобализацию при вызове внешних команд; ты должен сделать это сам. Для C см. Глобализация в C ++ / C, в Windows .

0 голосов
/ 05 января 2011

В конце вывода из SET /? находится этот камень о задержанном извлечении переменных среды. В нем показано, как использовать относительно новую нотацию (начиная с NT 3.1 - она ​​работает в XP и Win 7) для отложенного расширения переменной среды для создания списка имен файлов, соответствующих шаблону в одной переменной.

Задержка расширения переменной среды позволяет использовать другой символ (восклицательный знак), чтобы раскрыть переменные среды в время исполнения. Если включено замедленное расширение переменной, выше примеры могут быть написаны следующим образом, чтобы работать как задумано:

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

Обратите внимание, что здесь есть проблема с цитированием имен, содержащих пробелы или другие "интересные" символы, которые я оставил в качестве упражнения для студента. Правильное цитирование в CMD.EXE еще сложнее, чем в любой оболочке Unix.

Естественно, замените команду echo вашей командной строкой.

Редактировать: Было замечено, что в пакетном файле это работает не так хорошо, и это зависит от того, какая специфическая функция отложенного расширения включена.

Функция отложенного расширения активируется переключателем /V:ON на CMD.EXE или глобально для всех вызовов CMD с помощью ключа реестра. Подробности задокументированы в выводе CMD /?.

Переходя к пакетному файлу, у вас есть пара проблем и простое исправление для включения этой функции. Ключ в том, что команда SETLOCAL имеет возможность включать и выключать функцию задержки по желанию. От CMD /?:

В пакетном файле SETLOCAL ENABLEDELAYEDEXPANSION или DISABLEDELAYEDEXPANSION Аргументы имеют приоритет над ключом /V:ON или /V:OFF. Смотри SETLOCAL /? для деталей.

Кроме того, существует загадочная необходимость удваивать знаки процента в некоторых контекстах, таких как FOR команды. Все вместе, я бы переписал мой пример так:

SETLOCAL ENABLEDELAYEDEXPANSION 
set LIST=
for %%f in (*.ts) do set LIST=!LIST! "%%f"
echo %LIST:~1%

Вышеприведенное также заключает в кавычки каждое имя файла, чтобы иметь дело с именами, в которых есть пробелы, и обрезает дополнительный пробел в начале строки, оставленной там первой итерацией цикла, с %LIST:~1%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...