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

#windows #batch-file

Вопрос:

Я хотел бы написать простую строку для перечисления всех файлов в папке с заданным расширением. Вот что я попробовал:

 FOR %I IN (.*) DO IF %~NXI == *.asm  @ECHO %~I
 

К сожалению, это не работает!

Проблема, похоже, связана с * подстановочным знаком, потому что при изменении на просто:

 FOR %I IN (.*) DO IF %~NXI == r_draw16.asm  @ECHO %~I
 

это действительно работает — выводит .r_draw16.asm результат, как и ожидалось!

Мой вопрос в том, ПОЧЕМУ решение с подстановочным знаком не работает и как его исправить, чтобы выполнить эту работу?

Комментарии:

1. Ну, раз вы ищете asm файлы, почему бы просто не использовать расширение? FOR %I IN (.*) DO @IF /I "%~xI" == ".asm" ECHO %~I . В пакетном файле вам придется удвоить % символы, т. е. @FOR %%I IN (.*) DO @IF /I "%%~xI" == ".asm" ECHO %%~I . Однако это было бы проще в использовании @FOR %%I IN (.*.asm) DO @ECHO %%~I . Если вы откроете окно командной строки, наберете for /? и нажмете [ENTER] клавишу, вы увидите все доступные модификаторы.

2. IF сравнение — это строковые литералы, если вы не сравниваете целое число. Не существует формы регулярных выражений для сравнения с IF командой. FINDSTR Команда действительно имеет ограниченные возможности регулярного выражения.

3. О чем dir *.asm /A-D /B ? Откройте командную строку , запустите dir /? и прочитайте выходную справку. Было бы также хорошо запустить один раз for /? и if /? и echo /? , а также команду help , чтобы отобразить (неполный) список команд Windows , также объясненный SS64.com — Индекс A-Z команд Windows CMD .

Ответ №1:

Вы можете попробовать это:

 @echo off
for %%I in (*.asm) do echo %%I