командный файл подсказка буква диска

344
Pedro Velez

Я работал над этим простым пакетом в Windows 7, у него есть буква диска, установленная для удаления всех файлов и папок внутри. И если диск не был подключен, он должен предложить пользователю ввести его, здесь:

@echo off  set folder="t:\"  IF EXIST "%folder%" (  cd /d %folder% for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)  )ELSE (@echo this drive is not mounted, please enter a new one.  set /p drive=  cd /d %drive% for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q) @pause) 

Что касается IF EXISTдетали, она работает отлично, но когда диск не смонтирован, после ввода новой буквы диска он не будет работать. Есть идеи ?, заранее спасибо.

1
Вы говорите «диск», но затем в коде используйте «папку». Как можно смонтировать папку? Если вы действительно хотите удалить все файлы и папки на диске, почему бы не отформатировать его? Если вы хотите удалить папку, ее файлы и подкаталоги, используйте такие вещи, как `deltree` phuclv 7 лет назад 0
Он говорит «папка», а затем «диск в другой части», поскольку, насколько мне известно, переменные могут принимать любое имя, которое может прийти на ум, хотя я могу ошибаться. Pedro Velez 7 лет назад 0
Что бы вы ни хотели сделать, вы сделали это неправильно. Удаление файлов и папок по одному чрезвычайно дорого по сравнению с одним `deltree` phuclv 7 лет назад 0
Мой вопрос говорит о том, что при взаимодействии с пользователем, после того, как введена буква диска, он не будет работать, поэтому вы в основном сосредотачиваетесь на чем-то не относящемся к делу, а именно на дисках, а не на методах, которые здесь имеют значение. Pedro Velez 7 лет назад 0
Вы можете монтировать разделы в папки, начиная с win 2k Canadian Luke 7 лет назад 0

1 ответ на вопрос

1
DavidPostill

если диск не подключен, после ввода новой буквы он не будет работать

Вам необходимо enabledelayedexpansion:

добавлять

setlocal enabledelayedexpansion 

в начале вашего командного файла и заменить %drive%на!drive!

Исправленный пакетный файл:

@echo off  setlocal enabledelayedexpansion set folder="t:\"  IF EXIST "%folder%" ( cd /d %folder% for /F "delims=" %%i in ('dir /b') do ( rmdir "%%i" /s/q || del "%%i" /s/q ) ) ELSE ( @echo this drive is not mounted, please enter a new one. set /p drive= cd /d !drive! pause for /F "delims=" %%i in ('dir /b') do ( rmdir "%%i" /s/q || del "%%i" /s/q )  ) @pause endlocal 

Дальнейшее чтение

Теперь это работает, мне пришлось избавиться от обоих «echo rmdir» и «echo dir» и просто оставить «rmdir» и «del», чтобы в этом случае фактически удалить содержимое папки или диска. enableDelayedExpansion сделал это. Pedro Velez 7 лет назад 0
@PedroVelez Извините, я добавил `echo`s в качестве меры безопасности при тестировании и забыл удалить их: / Ответ обновлен. DavidPostill 7 лет назад 0
Таким образом, дьявол был в деталях @DavidPostill. Программа должна ссылаться на переменную во время выполнения, а не на время разбора. Таким образом, в моем тесте он успешно запустил код в части IF EXIST, а не в части ELSE. : / Pedro Velez 7 лет назад 0
@PedroVelez Да, это отчасти правильно, но никак не связано с `if`. Весь файл анализируется, но значение `диск` недоступно до времени выполнения, потому что вы читаете его с помощью` set / p`. `folder` доступен во время разбора, потому что ему явно присваивается значение в самом пакетном файле. DavidPostill 7 лет назад 0
@PedroVelez Стоит прочитать [Включить и отключить отложенное расширение, что оно делает?] (Https://stackoverflow.com/q/22278456) и связанные вопросы, поскольку они объясняют это лучше, чем я могу :) DavidPostill 7 лет назад 0
@PedroVelez В данном конкретном случае да. Но, пожалуйста, помните, что задержка расширения является гораздо более широкой проблемой. Смотрите ссылки, которые я дал вам :) DavidPostill 7 лет назад 0

Похожие вопросы