Как удалить определенные папки с помощью пакета - PullRequest
0 голосов
/ 05 июня 2018

Я хочу удалить все папки, которые отмечены более высоким номером, чем в параметре.

Например, если я наберу batchname 20, пакетный файл должен удалить папки, которые называются p21,p22, p23 и оставьте папки, которые называются p1, p2, p3, [...], p20.

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

for /D %%D in ("*") do (
    if /I not "%%~nxD"=="p%1" rd /S /Q "%%~D"
)
for %%F in ("*") do (
    del "%%~F"

Как мне заставить этот скрипт работать согласно приведенному выше?

1 Ответ

0 голосов
/ 05 июня 2018

Этот закомментированный пакетный файл можно использовать для этой задачи.

@echo off
rem Is the batch file not called with at least one parameter?
if "%~1" == "" goto :EOF

rem Is the parameter string not a positive number?
for /F "delims=0123456789" %%I in ("%~1") do goto :EOF

rem Convert the number string to an integer and back to a number string
rem using an arithmetic expression and then check for equal strings. A
rem difference means that the number string was not in valid range of
rem 0 to 2147483647 or was with leading zeros resulting in interpreting
rem the number as octal number on conversion to integer.

set /A Number=%~1 2>nul
if not "%~1" == "%Number%" set "Number=" & goto :EOF

rem Search for non hidden directories in current directory starting
rem with letter P. For each found directory matching this simple
rem wildcard pattern use an arithmetic expression to convert the
rem number string without first character P to an integer and back
rem to a number string. Then compare case-insensitive the original
rem directory name with rebuild directory name to make sure that the
rem found directory has a name consisting really of just letter P and
rem a decimal number in range 0 to 2147483647 without leading zeros.
rem If this condition is true, compare the two numbers using an integer
rem comparison and remove the directory quietly and with all files and
rem subdirectories on having a number greater than the parameter number.

setlocal EnableDelayedExpansion
for /D %%I in (p*) do (
    set "Number=%%I"
    set /A Number=!Number:~1! 2>nul
    if /I "p!Number!" == "%%I" if !Number! GTR %~1 ECHO rd /Q /S "%%I"
)
endlocal

Примечание: Осталось ECHO до команды rd для вывода на консоль, какие каталогибудет удален при запуске этого командного файла из окна командной строки.Удалите команду ECHO после проверки, запустив пакетный файл с различными номерами, если пакетный файл действительно работает должным образом в каталоге, содержащем папки p1, p2, ...

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

@for /D %%I in (p*) do @for /F "delims=Pp" %%J in ("%%I") do @if %%J GTR %~1 ECHO rd /Q /S "%%I"

Снова необходимо удалить команду ECHO, чтобы действительно удалить подкаталогис номером, превышающим номер, переданный в пакетный файл в качестве первого аргумента.

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

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...