Командная строка «dir / b / s> file.txt» должна удалить каталоги из результатов - PullRequest
4 голосов
/ 01 июня 2011

Я использую следующую команду для рекурсивного вывода полных списков файлов из каталога.

dir / b / s c: \ myfolder> c: \ mylist.txt

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

У кого-нибудь есть идеи?

Ответы [ 6 ]

5 голосов
/ 17 ноября 2013

Вроде старый вопрос, но если кто-то наткнется на это в надежде на ответ, возможно, это поможет им.

Для запуска из командной строки Windows (CMD.exe) используйте:

setlocal enabledelayedexpansion    
for /f "delims=" %a in ('dir /b /s c:\myfolder"') do (@echo %~nxa >>c:\mylist.txt)
endlocal

Выполнение этого из сценария Windows .BAT:

setlocal enabledelayedexpansion    
for /f "delims=" %%a in ('dir /b /s c:\myfolder"') do (@echo %%~nxa >>c:\mylist.txt)
endlocal

Вывод может выглядеть примерно так в зависимости от того, какие файлы находятся в папке, в которой вы запускаете код:

file1.fil
file2.fil
file3.fil

ПОНИМАНИЕ, ЧТО ДЕЛАЕТ КОДЕКС

для / f

  • означает, что в этом случае запускать циклические файлы с помощью команды dir /b /s, чтобы помочь получить имена этих файлов из каталогов (папок) и подкаталогов (подпапок). Как указано в вопросе, это даст вам полный путь к файлам. Так что вместо file.txt вы получите C: \ folder \ file.txt.

"delims ="

  • в этом случае сообщает циклу for, что он хочет переменную% a или %% a иметь только 1 путь к папке и имя файла для каждого цикла.

% a (CMD.exe) %% a (.BAT)

  • как упоминалось выше, это переменная, которая меняется с каждым циклом. так каждый раз команда dir /b /s находит новое имя переменной %% a изменяет имя файла.
  • Пример: Цикл 1: %% a = c: \ folder \ file1.fil Цикл 2: %% a = c: \ folder \ file2.fil

dir / b / s

  • - команда для распечатки файлов каталога (папки). От используя /b и /s, спрашивающий добавляет дополнительные критерии. команда dir не только распечатывает файлы и каталоги (папки) в этом каталоге (папке), а также некоторые дополнительные информация о каталоге.

    • /b сообщает команде dir, что ей не нужны дополнительные информация ... только имена файлов.
    • /s говорит команде dir включить все файлы и подкаталоги (подпапки) в этой папке.

до

  • является частью цикла, которая сообщает, что делать во время этого конкретного петля. Так что в этом случае это делает только одну команду каждый цикл (@echo %%~nxa >>c:\mylist.txt)

@ эхо

  • - простая команда, которая выводит на экран все, что вы хотите. экран компьютера или в этом случае в текстовый файл с помощью @echo %%~nxa >>c:\mylist.txt
  • >> до c: \ mylist.txt особенно важно. Каждый раз цикл происходит, он начинает новую строку в текстовом файле и записывает переменная в этой строке. Если указан только один >, он будет перезаписан строка в текстовом файле каждый раз, когда происходит цикл. Который будет победить цель того, для чего предназначен этот скрипт.

% ~ nxa (CMD.exe) %% ~ nxa (.BAT)

  • - это переменная %% a, как указано выше, за исключением того, что она анализируется (редактируется) так, как просил спрашивающий @ fightstarr20. Вместо распечатка переменной как C: \ myfolder \ myfile.fil переменной распечатает как myfile.fil
  • ~ в %%~nxa сообщает программе, что вы хотите изменить переменную %% а. В этом случае добавив n и x.
  • n в %%~nxa сообщает программе, что вы хотите изменить переменную %% a исключая путь из переменной.

    • пример.

           -variable %%a = C:\folder\filename.fil 
           -variable %%~na = filename. 
      

      -Если вы заметили, однако, что оно оставляет расширение .fil вне имени файла.

  • x в %%~nxa сообщает программе, что вы хотите изменить переменную %% a исключив путь и имя файла из переменной, так что все, что вы получите, это расширение имени файла.

    • пример.

           -variable %%a = C:\folder\filename.fil
           -variable %%~xa = .fil
      
  • так что если вы объедините оба модификатора n и x с переменной %% a Вы получите полное имя файла, включая расширение.

    • пример:

           -variable %%a = c:\folder\filename.fil
           -variable %%~nxa = filename.fil
      

setlocal enabledelayedexpansion

  • объяснил просто команду, которая должна быть в сценарии, прежде чем цикл for, позволяющий изменять или «расширять» переменную %% a.

Endlocal

  • это отключает команду setlocal enabledelayedexpansion

Чтобы получить очень полезное объяснение и справочник по командам CMD, я рекомендую прочитать ss64.com и для отличного форума, чтобы получить ответы CMD, я бы порекомендовал dostips.com

2 голосов
/ 03 марта 2015

Используйте это так

dir /b /s C:\myfolder>C:\temp.txt
echo exit>>C:\temp.txt
goto loop

:loop
set /p _x=<temp.txt
findstr /v /c:"%_x%" temp.txt>temp2.txt
type temp2.txt>temp.txt
set _x=%_x:*\=%
echo %_x%>file.txt
if "%_x%" == "exit" (
del temp.txt
del temp2.txt
exit
)
goto loop

Вы можете использовать вместо goto, если хотите, но это будет в основном то же самое.Извините за последний ...

2 голосов
/ 01 июня 2011

Измените свое регулярное выражение, чтобы получить имя файла по всему пути.

Если вы можете использовать powershell, посмотрите на Get-ChildItem.Вы можете использовать более мощные опции.

0 голосов
/ 24 ноября 2016

Вы можете просто использовать этот код:

dir /b > A_fileslist.txt

Скопируйте в редакторе блокнота и сохраните как "Fileslist.bat".

0 голосов
/ 06 июля 2015

Это наверняка сработает, так как работает для меня.

dir D: (путь к файлам) / s / b> d: \ filelist.txt

0 голосов
/ 13 апреля 2014

Я знаю, что немного опоздал, но мне больно, что никто не сказал, чтобы забрать / s

dir /b c:\myfolder > c:\mylist.txt

Это должно сделать это.

...