Как удалить указанный файл c в неизвестном каталоге из файлов RAR? - PullRequest
0 голосов
/ 18 января 2020

Мне нужно удалить patata.pat файлы из примерно 2000 * .rar файлов, большинство из которых находятся внутри папок \unknown folder\patata\ или \patata\ в этих rar файлах, но могут находиться в еще более глубоких каталогах.

Я безуспешно пытался

for %%f in (*.rar) do "%ProgramFiles%\WinRAR\RAR.exe" d "%%f" patata.pat

и

for %%f in (*.rar) do "%ProgramFiles%\WinRAR\RAR.exe" d "%%f" %~dp0\patata\patata.pat

Я догадался, что последнее не сработает.

Как удалить конкретный c файл в неизвестном каталоге из файлов RAR?

1 Ответ

0 голосов
/ 18 января 2020

Эту задачу можно выполнить с помощью командного файла со следующей единственной командной строкой:

@for /F "eol=| delims=" %%I in ('dir "%~dp0*.rar" /A-D /B 2^>nul') do @"%ProgramFiles%\WinRAR\Rar.exe" d -idcd "%~dp0%%I" "patata.pat" "*\patata.pat"

Эта командная строка работает даже на дисках FAT16, FAT32 и exFAT, не обрабатывая файл * .rar более одного раза. .

Можно также использовать следующую командную строку в командном файле при выполнении на разделе NTFS.

@for %%I in ("%~dp0*.rar") do @"%ProgramFiles%\WinRAR\Rar.exe" d -idcd "%%I" "patata.pat" "*\patata.pat"

Эта командная строка обрабатывает все файлы * .rar в каталоге пакетный файл не работает корректно на дисках FAT16, FAT32 и exFAT из-за списка записей каталога и порядка изменений записей каталога * .rar при каждом выполнении Rar.exe в случае изменения файла RAR из-за удаления patata.pat из root архива или любого каталога внутри архива или всего файла RAR, если он не содержит ничего, кроме patata.pat. Таким образом, файлы RAR обрабатываются более одного раза, и некоторые файлы RAR могут быть по ошибке пропущены при использовании этой командной строки на дисках с файловой системой FAT16, FAT32 или exFAT.

Разница в том, что первая командная строка приводит к выполнению FOR в фоновом режиме с %ComSpec% /c с командной строкой DIR , добавленной в качестве дополнительных аргументов еще одним командным процессом, который выполняет команду DIR для вывода всех имен файлов RAR просто имя файла и расширение файла до STDOUT фонового командного процесса. Этот вывод захватывается FOR и следующей обработкой построчно. Таким образом, изменения в списке записей каталога, вызванные Rar.exe, не имеют значения, поскольку список имен файлов в памяти обрабатывается FOR вместо списка записей каталога, изменяющегося во время итераций l oop. .

Хитрость заключается в том, чтобы один раз указать patata.pat без пути для удаления этого файла в root файла RAR и еще раз с помощью *\patata.pat, чтобы удалить его из файла RAR с любым путем, сохраненным в RAR-файл. *\ для любого пути есть нечто особенное, объясненное в Rar.txt, которое является руководством WinRAR консольная версия Rar.exe.

Команда RAR d для удаления каталога или файла из файла RAR и переключателя -idcd для подавления авторских прав, а сообщения Done документируются также в текстовом файле Rar.txt.

Путь к каталогу пакетного файла, на который ссылается %~dp0, всегда расширяется до строка, заканчивающаяся \. По этой причине %~dp0 никогда не следует объединять с дополнительным обратным символом sh с именем папки или файла, так как это приводит к окончательному выполнению двух последовательных обратных слэшей, и ядро ​​Windows должно удалить дополнительный обратный слэш sh перед передачей. полное имя файла / папки для файловой системы.

...