Как исключить удаление папок с помощью цикла for в пакетном скрипте? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь удалить все в определенном пользователем месте за исключением одной предварительно определенной папки, используя цикл for.Как мне добавить исключение, чтобы не удалять папку.

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

Это всего лишь часть кода из-за указаний stackoverflow, он удаляет все, включая папку, которую я хочу исключить....

Rem This code is intended to delete all except one pre-defined folder
Echo Deleting all the files except testmappe3
del /s /q "%CD%"
for /d %%p in ("%CD%") do rmdir "%%p" except "%%testmappe3" /s /q 
dir
Pause
...

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

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Прежде всего, я бы очень осторожно удалил все, используя %cd%, особенно если сценарий может быть случайно запущен от имени администратора, где %cd% будет тогда c:\windows\system32.

Вместо этого используйте %~dp0 в качестве пути, чтобы убедиться, что вы находитесь в правильном каталоге. Все это предполагает, что вы не cd где-то еще ранее в сценарии.

Тогда к фактической проблеме я бы добавил findstr, чтобы исключить ваш каталог `testmappe3, а также сам ваш скрипт.

@echo off
cd /d "%~dp0"
for /f %%p in ('dir /b ^| findstr /vi /r /c:^testmappe3$') do (
    rmdir "%%p" /s /q >nul 2>&1
    if not "%%p"=="%~nx0" del /s /q "%%p" >nul 2>&1
)

Если вы хотите придерживаться исходного метода удаления, он будет таким, как показано ниже, но если ваш сценарий находится в том же каталоге, он также будет удален:

@echo off
cd /d "%~dp0"
del /s /q *
for /f %%p in ('dir /b ^| findstr /vi /r /c:^testmappe3$') do (
    rmdir "%%p" /s /q >nul 2>&1
)

Если ваша папка для исключения содержит пробелы, требуются двойные кавычки .. т.е.

dir /b ^| findstr /vi /r /c:^"test mappe3"$
2 голосов
/ 14 мая 2019
for /d %%A in ("%CD%\*") do (
    set "except="
    if /i "%%~nxA" == "testmappe3" set "except=1"
    if not defined except rmdir /s /q "%%~A"
)

Этот код будет перебирать папки в текущем каталоге. Если n ame + e x натяжение папки testmappe3, тогда except будет установлено как 1, то есть определено значением. Если исключение не определено, rmdir удалит папку.

Вы можете добавить больше if строк для проверки папок, кроме.

Модификаторы распознают папку с именем testmappe3.test1 как n ame testmappe3 и е х напряжение .test1.

Просмотр for /? и call /? о модификаторах.

Просмотр for /?, set /?, if /? и rmdir /? для помочь с этими командами.

...