बैच फ़ाइल शीघ्र ड्राइव पत्र


1

मैं विंडोज 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 भाग, यह पूरी तरह से काम करता है, लेकिन जब ड्राइव माउंट नहीं होता है, तो एक बार जब आप एक नया ड्राइव अक्षर दर्ज करते हैं, तो यह काम नहीं करेगा। किसी भी विचार ?, अग्रिम धन्यवाद।


आप कहते हैं "ड्राइव" लेकिन फिर कोड में "फ़ोल्डर" का उपयोग करें। एक फ़ोल्डर कैसे माउंट किया जा सकता है? यदि आप वास्तव में एक ड्राइव पर सभी फ़ाइलों और फ़ोल्डरों को हटाना चाहते हैं तो इसे केवल प्रारूपित क्यों न करें? यदि आप किसी फ़ोल्डर को हटाना चाहते हैं और उसकी फाइलें और उपनिर्देशिका जैसी चीजों का उपयोग करते हैं deltree
phuclv

इसे फोल्डर कहते हैं, फिर कहते हैं कि दूसरे हिस्से में ड्राइव करें, जहां तक ​​मैं संबंधित वेरिएबल का नाम लेता हूं जो भी मन में आता है, मैं गलत हो सकता हूं।
Pedro Velez

आप जो भी करना चाहते हैं, वह आपने गलत तरीके से किया है। एक के बाद एक फ़ाइलों और फ़ोल्डरों को निकालें एक की तुलना में बेहद महंगा है deltree
phuclv

मेरा सवाल यह है कि उपयोगकर्ता के इंटरैक्शन पर, एक बार ड्राइव लेटर डालने के बाद यह काम नहीं करेगा, इसलिए आप मूल रूप से उस चीज़ पर ध्यान केंद्रित कर रहे हैं जो अप्रासंगिक है, यह ड्राइव है और यहां उन तरीकों को नहीं हटाएं जो मायने रखती हैं।
Pedro Velez

आप 2k जीत के बाद से, कभी भी फ़ोल्डर में विभाजन माउंट कर सकते हैं
Canadian Luke

जवाबों:


1

जब ड्राइव को माउंट नहीं किया जाता है, तो एक बार जब आप एक नया ड्राइव अक्षर दर्ज करते हैं, तो यह काम नहीं करेगा

आपको 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

आगे की पढाई


अब यह काम करता है, मुझे "इको रूम" और "इको डायर" दोनों से छुटकारा पाना था और इस मामले में वास्तव में फ़ोल्डर या ड्राइव की सामग्री को हटाने के लिए 'rmdir' और 'डेल' छोड़ना था। enableDelayedExpansion ने किया।
Pedro Velez

@PedroVelez क्षमा करें, मैंने डाल दिया echo इसे परीक्षण करते समय सुरक्षा एहतियात के रूप में है और उन्हें हटाने के लिए भूल गया: / उत्तर अपडेट किया गया।
DavidPostill

तो शैतान विस्तार से @DavidPostill पर था। कार्यक्रम को पार्स समय के बजाय निष्पादन समय में एक चर का संदर्भ देने की आवश्यकता है। इस प्रकार मेरे परीक्षण में यह सफलतापूर्वक IF EXIST भाग में कोड चलाता है और ELSE एक में नहीं। : /
Pedro Velez

@PedroVelez हां, यह सही है, लेकिन इससे कोई लेना देना नहीं है if। संपूर्ण फ़ाइल पार्स की गई है, लेकिन मान है drive रन टाइम तक उपलब्ध नहीं है क्योंकि आप इसे पढ़ते हैं set /pfolder यह पार्स समय पर उपलब्ध है क्योंकि इसे स्पष्ट रूप से बैच फ़ाइल में ही मान दिया जाता है।
DavidPostill

@PedroVelez यह पढ़ने लायक है सक्षम करें और विलंबित विस्तार अक्षम करें, यह क्या करता है? और इससे जुड़े प्रश्न जैसे कि मैं इसे बेहतर समझाता हूँ :)
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.