У меня есть набор базовых имен файлов, для каждого имени «f» есть ровно два файла, «f.in» и «f.out». Я хочу написать командный файл (в Windows XP), который проходит через все имена файлов, для каждого он должен:
- Показать базовое имя 'f'
- Выполните действие на «f.in»
- Выполните еще одно действие на «f.out»
У меня нет никакого способа перечислить набор базовых имен файлов, кроме как для поиска * .in (или * .out), например.
command-line
windows-xp
batch-file
Люк Холливэлл
источник
источник
Ответы:
Предполагая, что у вас есть две программы, которые обрабатывают два файла, process_in.exe и process_out.exe:
%% ~ nf - это модификатор замещения, который расширяет% f только до имени файла. См. Другие модификаторы в https://technet.microsoft.com/en-us/library/bb490909.aspx (посередине страницы) или просто в следующем ответе.
источник
%%f
почему это%%~nf
позже?~
модификаторов для выполнения действий , как в моем примере, просто получить имя файла. Это просто привычка для меня использовать это на тот случай*
, если путь полностью или что-то еще. Существует несколько таких модификаторов (в середине страницы): microsoft.com/resources/documentation/windows/xp/all/proddocs/…Вы можете использовать эту строку для печати содержимого вашего рабочего стола:
Если у вас есть
%%I
переменная, вы легко можете выполнить команду (просто замените слово echo на вашу программу)Кроме того, улучшена замена ссылок на переменные FOR. Теперь вы можете использовать следующий необязательный синтаксис:
https://ss64.com/nt/syntax-args.html
В приведенных выше примерах
%I
и PATH могут быть заменены другими действительными значениями.%~
Синтаксис завершается допустимым именем переменной FOR. Выбор имен переменных в верхнем регистре, например,%I
делает его более читаемым и позволяет избежать путаницы с модификаторами, которые не чувствительны к регистру.Вы можете получить полную документацию, набрав
FOR /?
источник
%%I was unexpected at this time.
%I
вместо%%I
На мой взгляд, проще всего использовать цикл for, который вызывает второй пакетный файл для обработки, передавая этому второму файлу базовое имя.
По словам для /? справка, базовое имя может быть извлечено с использованием опции ~ nifty. Итак, базовый скрипт будет выглядеть так:
Затем в process.cmd предположим, что% 0 содержит базовое имя, и действуйте соответственно. Например:
Возможно, есть лучший способ сделать это в одном скрипте, но я всегда немного сомневался в том, как использовать несколько команд в одном цикле for в пакетном файле.
РЕДАКТИРОВАТЬ: это фантастика! Я как-то пропустил страницу в документах, которая показала, что вы можете делать многострочные блоки в цикле FOR. Я собираюсь пойти придется вернуться и переписать некоторые командные файлы сейчас ...
источник
Расширение на пост Натана . Далее будет выполнено задание в одном пакетном файле.
источник
Существует инструмент, обычно используемый в MS Servers (насколько я помню), называемый forfiles :
Ссылка выше содержит справку, а также ссылку на страницу загрузки Microsoft.
источник
Код ниже фильтрует имена файлов, начиная с заданной подстроки. Его можно изменить, чтобы он соответствовал различным потребностям, работая над извлечением подстроки и подстановкой IF:
источник
Повторение f.in и f.out будет разделять концепцию того, что зацикливать, а что не зацикливать при использовании в цикле for / f.
Хотя вы не спрашивали, хороший способ передать команды в f.in и f.out - это ...
Ссылка на все команды Windows XP: ссылка
Я прошу прощения, если я не ответил правильно. Мне было очень трудно читать этот вопрос.
источник