#batch-file #directory #rmdir
Вопрос:
Нужен способ удалить папку (rd/rmdir), если в ней содержится только один конкретный файл. Если есть какие-либо другие файлы или вложенные папки, игнорируйте их. Пытаясь сделать это с помощью как можно меньшего количества кода. В настоящее время я занимаюсь этим…
If Exist "C:FolderSubFolderfilename.txt" Move /Y "C:FolderSubFolderfilename.txt" "%TEMP%" If Not Exist "C:FolderSubFolder*" RD "C:FolderSubFolder" /Q /S
Однако, даже если папка не содержит файлов, она никогда не удаляется.
Возможно ли это в пакетном файле? Спасибо заранее.
Комментарии:
1.
If Not Exist "C:FolderSubFolder*"
это твоя проблема. Вы не можете использовать wilcard для поиска любого подобного файла.2. Не могли бы вы уточнить, пожалуйста, точную задачу? Нужно ли идентифицировать каталог, содержащий только один конкретный файл, но никаких других объектов файла или каталога, и, если он найден, переместить этот файл и удалить этот каталог? Нужно ли найти каталог, содержащий определенный файл, переместить этот файл, а затем удалить этот каталог независимо от любых других объектов файла или каталога, которые могут в нем оставаться? Или, возможно, определить каталог, содержащий конкретный файл, и только в том случае, если этот каталог станет пустым после перемещения этого файла, удалить этот каталог?
Ответ №1:
вы можете использовать find
для подсчета количества файлов в каталоге, а затем findstr
определить уровень ошибки и просто использовать условный оператор amp;amp;
Также не нужно проверять, существует ли файл, вы можете перенаправить stderr на nul
, если файл не найден.
@echo off Move /Y "C:FolderSubFolderfilename.txt" "%TEMP%" 2gt;nul (dir /b "C:FolderSubFolder*" | find /C /V "^" | findstr /R "lt;0gt;") amp;amp; rd /S /Q "C:FolderSubFolder"
Редактировать
Как вы упомянули, теперь вы хотите переместить файл только в том случае, если это единственный файл в каталоге, несколько поправок в текущем коде решают эту проблему:
@echo off set "_dir=C:FolderSubFolder" set "fname=filename.txt" (dir /b "%_dir%*" | find /C /V "^" | findstr /R "lt;1gt;" gt;nul) amp;amp; if exist "%_dir%%fname%" ( move /Y "%_dir%%fname%" "%temp%" rd /S /Q "%_dir%" )
На этот раз мы проверяем, есть ли в папке только 1 элемент (файл или каталог), если да, мы проверяем, есть ли он filename.txt
, если нет, то мы пропустим блок кода, если да, переместим файл и удалим каталог.
Я создал переменные для вас, _dir
и fname
таким образом вы обновляете только эти два поля, а не весь код.
Комментарии:
1. Это прекрасно работает! Однако теперь, после перемещения рассматриваемого файла во временную папку, если папка, которую вы проверяете, не пуста, как нам переместить файл обратно? Еще раз спасибо.
2. Обновит ответ.