Мені потрібно видалити всі порожні папки з моєї папки програми за допомогою командного рядка Windows?
Як я можу створити такий файл bat?
Будь ласка, допоможи мені.
Відповіді:
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"
з: http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx
Звичайно, я б спершу протестував його, не видаляючи, перш ніж виконувати цю команду. Крім того, ось модифікована версія з коментарів, яка включає папки з пробілами:
for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"
PS У дописі в блозі є більше коментарів, які можуть вам допомогти, тому обов’язково прочитайте їх, перш ніж спробувати
%%d
на%d
Ви можете скористатися ROBOCOPY
командою. Це дуже просто, а також може використовуватися для видалення порожніх папок всередині великої ієрархії.
ROBOCOPY folder1 folder1 /S /MOVE
Тут і джерело, і місце призначення folder1
, оскільки вам потрібно лише видалити порожні папки, замість того, щоб переміщувати інші (необхідні) файли в іншу папку. /S
варіант - пропустити копіювання (переміщення - у наведеному вище випадку) порожніх папок. Це також швидше, оскільки файли переміщуються всередині одного диска.
Більш простий спосіб - зробити xcopy, щоб скопіювати всю структуру каталогів за допомогою перемикача / s. help for / s каже Копіює каталоги та підкаталоги, крім порожніх.
xcopy dirA dirB /S
де dirA є джерелом із порожніми папками. DirB буде копією без порожніх папок
xcopy dirA dirB /SI
буде пропущено підказку "Чи вказує dirB ім'я файлу або ім'я каталогу на цілі?"
Вам не потрібно usebackq:
FOR /F delims^= %%A IN ('DIR/AD/B/S^|SORT/R') DO RD "%%A"
До корозійної відповіді з тієї ж сторінки, на яку посилаються, додається версія PowerShell http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx#8408736
Get-ChildItem -Recurse . | where { $_.PSISContainer -and @( $_ | Get-ChildItem ).Count -eq 0 } | Remove-Item
або, більш стисло,
gci -R . | where { $_.PSISContainer -and @( $_ | gci ).Count -eq 0 } | ri
заслуга належить автору публікації
Це гібрид із вищезазначеного. Він видаляє ВСІ файли старше X днів і видаляє всі порожні папки для вказаного шляху. Для використання просто встановіть дні, шлях до папки та диск
@echo off
SETLOCAL
set days=30
set folderpath=E:\TEST\
set drive=E:
::Delete files
forfiles -p %folderpath% -s -d -%days% -c "cmd /c del /q @path "
::Delete folders
cd %folderpath%
%drive%
for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"`
"dir /ad/b/s | sort /R"
) do rd "%% d"
з командного рядка: для / R / D% 1 у (*) виконайте rd "% 1"
у пакетному файлі для / R / D %% 1 у (*) зробити rd "%% 1"
Не знаю, чи задокументовано це як таке, але він працює в W2K, XP та Win 7. І я не знаю, чи буде це працювати завжди, але файли випадково не видалятимуться.
Встановіть будь-який інтерпретатор UNIX для Windows (Cygwin або Git Bash) і запустіть cmd:
знайти / шлях / до / каталогу -порожній -тип d
To find them
знайти / шлях / до / каталогу -порожній -тип d -видалити
To delete them
(насправді не використовуючи підказку windows cmd, але це просто і зайняло кілька секунд)
Це буде відпрацьовано чудово. Це найкращий спосіб видалити старі файли та рекурсивно видалити порожні каталоги. наступний файл .bat,
forfiles /p [PATH] /s /m [FILE-PATTERN] /d -[DAYS] /c "cmd /c del @path"
for /f "delims=" %%d in ('dir [PATH] /s /b /ad ^| sort /r') do rd "%%d"
Замінювачі потрібно замінити наступним чином (без лапок):
[DAYS] = Max. age of the files in days, e.g. “10”
[PATH] = Path to search for old files and empty folders, e.g. “C:\Backup\”
[FILE-PATTERN] = Pattern that matches files to delete, e.g. “*.bkp”
Сценарій був успішно протестований під Windows 7 та Windows Server 2003.
@echo off
set /p "ipa= ENTER FOLDER NAME TO DELETE> "
set ipad="%ipa%"
IF not EXIST %ipad% GOTO notfound
IF EXIST %ipad% GOTO found
:found
echo DONOT CLOSE THIS WINDOW
md ccooppyy
xcopy %ipad%\*.* ccooppyy /s > NUL
rd %ipad% /s /q
ren ccooppyy %ipad%
cls
echo SUCCESS, PRESS ANY KEY TO EXIT
pause > NUL
exit
:notfound
echo I COULDN'T FIND THE FOLDER %ipad%
pause
exit
Якщо ви хочете скористатися командним рядком ROBUN на варуні в контекстному меню Провідника (тобто клацніть правою кнопкою миші), тут імпортується реєстр Windows. Я спробував додати це як коментар до його відповіді, але вбудована розмітка була нездійсненною.
Я перевірив це на власному ПК з Windows 10, але використовую на свій страх і ризик. Він відкриє новий командний рядок, запустить команду і зробить паузу, щоб ви могли бачити результат.
Скопіюйте в новий текстовий файл:
Редактор реєстру Windows, версія 5.00
[HKEY_CURRENT_USER \ Software \ Classes \ directory \ Background \ shell \ Delete Empty Folders \ command] @ = "C: \ Windows \ System32 \ Cmd.exe / C \" C: \ Windows \ System32 \ Robocopy.exe \ "% V \ "\"% V \ "/ s / move \" && PAUSE "
[HKEY_CURRENT_USER \ Software \ Classes \ directory \ shell \ command Empty Folders \ command] @ = "C: \ Windows \ System32 \ Cmd.exe / C \" C: \ Windows \ System32 \ Robocopy.exe \ "% V \" \ "% V \" / s / move \ "&& PAUSE"
Перейменуйте розширення .txt на .reg
ну, просто швидка та брудна пропозиція щодо простої 1-рівневої структури каталогів без пробілів, [редагувати] та для каталогів, що містять лише ОДИН тип файлів, які я знайшов корисними (в якийсь момент з http://www.pcreview.co.uk /forums/can-check-if-folder-empty-bat-file-t1468868.html ):
for /f %a in ('dir /ad/b') do if not exist %a\*.xml echo %a Empty
/ ad: показує лише записи в каталозі
/ b: використовуйте відкритий формат (лише імена)
[редагувати] за допомогою простої зірочки для перевірки БУДЬ-ЯКОГО файлу (% a \ * вище) не буде працювати, дякую за виправлення
тому видалення буде:
for /f %a in ('dir /ad/b') do if not exist %a\*.xml rmdir %a
for /f "tokens=*" %%d in ('dir /ad/b/s ^| sort /R') do rd "%%d"