Пакетный файл: перечислить RAR-файл в определенной папке и записать результат в текстовый файл

У меня есть папка и содержит несколько RAR-файлов и подпапок. Эти подпапки содержат RAR-файл или подпапку (рекурсивная структура). Я хочу написать командный файл, в котором перечислены все RAR-файлы в этом дереве папок (полный путь). Результат записывается в текстовый файл.

Пример:

Специальная папка:

--Quest
--Quest--1.rar
--Quest--2.rar
--Quest--Sub--3.rar
--Quest--Con--4.rar
--Quest--Math--ams.doc

И результат после запуска командного файла в result.txt:

--\Quest\1.rar
--\Quest\2.rar
--\Quest\Sub\3.rar
--\Quest\Con\4.rar

2 ответа

Попробуйте вот так:

@echo off
set $root=Your\root\path
dir /s /b "%$root%"\*.rar>>result.txt

Я не могу добавить это как комментарий и, следовательно, опубликовать как ответ.

Третий аргумент команды dir это путь + спецификация файла. Поэтому весь аргумент должен быть заключен в двойные кавычки, а не только путь.

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

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

Синтаксический анализ аргументов командной строки C объясняет анализатор командной строки приложений, созданных с помощью Microsoft Visual C/C++, и не использует настраиваемый код запуска. К сожалению, нет описания того, что происходит с не экранированными двойными кавычками внутри строки аргумента.

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

Вот код этого небольшого консольного приложения:

#include <stdio.h>  // for printf()
#include <conio.h>  // for getch()

int main (int argc, char *argv[])
{
   int  iNumber;
   char sSpace[2] = " ";

   printf("The arguments of the program are:\n\n");
   if(argc < 10) *sSpace = '\0';
   for(iNumber = 0; iNumber < argc; iNumber++)
   {
      printf("Argument %s%d: %s\n",iNumber < 10 ? sSpace : "",iNumber,argv[iNumber]);
   }
   printf("\nPress any key to exit ...");
   getch();
   printf("\n\n");
   return(0);
}

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

Я скомпилировал этот небольшой код с очень старым компилятором Turbo C, который создает 16-разрядное приложение DOS, с DJGPP, в результате чего получилось 32-разрядное консольное приложение с 16-разрядным заголовком, а Visual C - настоящее 32-разрядное консольное приложение.

Скомпилированное консольное приложение имеет имя ArgCheck.exe и находится в C:\Temp, который является текущим рабочим каталогом в окне командной строки, открытом в Windows XP SP3 x86.

Используемая командная строка была: ArgCheck.exe "%WINDIR%"\*.exe

Выходные данные ArgCheck.exe скомпилированы с Visual C:

Argument 0: C:\Temp\ArgCheck.exe
Argument 1: C:\WINDOWS\*.txt

Выходные данные ArgCheck.exe скомпилированы с DJGPP:

Argument 0: C:\TEMP\ARGCHECK.EXE
Argument 1: C:\WINDOWS\*.txt

Выходные данные ArgCheck.exe скомпилированы с Turbo C:

Argument 0: C:\TEMP\ARGCHECK.EXE
Argument 1: C:\WINDOWS
Argument 2: \*.txt

Как видите, код запуска Turbo C также пропускает двойные кавычки, но двойная кавычка в аргументе интерпретировалась как конец аргумента, и в результате получается 2 аргумента, а не только 1.

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

Другие вопросы по тегам