2013-03-12 6 views
5

मेरे पास यह लूप है जो बाहरी फ़ाइल में प्रत्येक पंक्ति के लिए खुद को दोहराता है। मैं उपयोगकर्ता को प्रत्येक पास में एक विकल्प के लिए संकेत देना चाहता हूं, हालांकि यह काम नहीं करता है। मुझे लगता है कि समस्या किसी भी तरह लूप तोड़ने के साथ GOTO कमांड के साथ है। इस पर कोई विचार?फॉर लूप में विकल्प - विंडोज बैच

FOR /F %%i IN (%WORKDIR%\grunt-packages.ini) DO (
    CHOICE /C AN /M "Odinstalovat plugin" 
    IF %ERRORLEVEL%==1 GOTO UNINSTALL 
    IF %ERRORLEVEL%==2 GOTO SKIP 

    :UNINSTALL 
     ECHO Odstranuji %%i 
     CALL npm uninstall %%i 

    :SKIP 
     ECHO Preskakuji %%i 
) 

उत्तर

8

आपकी गणना सही है। लूप के लिए goto लूप को रोक देगा। इसके आस-पास के रास्ते call का उपयोग करना है। हालांकि, आपकी स्क्रिप्ट के साथ पहला अंक ERRORLEVEL चर के लिए देरी विस्तार की आवश्यकता है। जब भी एक चरम सीमा के भीतर सेट चर का विस्तार, नवीनतम मूल्य प्राप्त करने के लिए देरी विस्तार का उपयोग करें।

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
FOR /F %%i IN (%WORKDIR%\grunt-packages.ini) DO (
    CHOICE /C AN /M "Odinstalovat plugin" 
    IF !ERRORLEVEL!==1 CALL :UNINSTALL 
    IF !ERRORLEVEL!==2 CALL :SKIP 
) 
ENDLOCAL 
GOTO :EOF 

:UNINSTALL 
    ECHO Odstranuji %%i 
    CALL npm uninstall %%i 
    GOTO :EOF 

:SKIP 
    ECHO Preskakuji %%i 
    GOTO :EOF 
  1. gotofor छोरों के भीतर नहीं इस्तेमाल किया जा सकता।
  2. कोष्ठक कोष्ठक के भीतर सेट किए गए वैरिएबल को नए मान को पुनर्प्राप्त करने में देरी की आवश्यकता है। के बजाय !। अन्यथा, कोष्ठक के दायरे से पहले चर का मान उपयोग किया जाएगा।
+0

प्रतिभाशाली से दूर रहता है, धन्यवाद! – Ozrix

+0

+1, लेकिन मैंने एक वैकल्पिक उत्तर भी पोस्ट किया। – jimhark

5

@ मेट्ज़गर का जवाब एक अच्छी शुरुआत थी (मैंने इसे वोट दिया), लेकिन मुझे इसके साथ कुछ समस्याएं मिलीं। अंत में, मैं कोड इनलाइन डालना पसंद करता हूं और CALLs से बचता हूं।

@echo off 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
FOR %%i IN (A B C D) DO (
    CHOICE /C AN /M "Uninstall plugin %%i" 
    IF !ERRORLEVEL!==1 (
     ECHO Uninstall %%i 
    ) ELSE IF !ERRORLEVEL!==2 (
     ECHO Skip %%i 
    ) 
) 

मैं @ Windows XP पर Metzger 'जवाब परीक्षण किया और पाया निम्न समस्याओं:: यहाँ दिखाने के लिए कि यह कैसे हुआ अपने परीक्षण कोड है

  • सबरूटीन्स लापता GOTO :EOF (पहले से ही तय हो गई)
  • Windows XP पर , सबरूटीन्स में %%i सेट नहीं होने पर
  • (संभावित बग) की स्थापना रद्द करें सेट करता है ERRORLEVEL, छोड़ें
01 कहा जा सकता है

यह परीक्षण कोड समस्याओं को ठीक करता:

@echo off 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
FOR %%i IN (A B C D) DO (
    CHOICE /C AN /M "Uninstall plugin %%i" 
    SET OERRORLEVEL=!ERRORLEVEL! 
    IF !ERRORLEVEL!==1 CALL :UNINSTALL %%i 
    IF !OERRORLEVEL!==2 CALL :SKIP %%i 
) 
ENDLOCAL 
GOTO :EOF 

:UNINSTALL 
    ECHO Uninstall %1 
    GOTO :EOF 

:SKIP 
    ECHO Skip %1 
    GOTO :EOF 
+0

+1 वे नोट करने के लिए अच्छे अंक हैं। ** ':)' ** विशेष रूप से, ERRORLEVEL को संभवतः अनइंस्टॉल में सेट किया जा रहा है। मैंने पैरामीटर के रूप में '%% i' पास करने का उल्लेख करने के बारे में सोचा, लेकिन अनुमान लगाया गया कि इसकी आवश्यकता नहीं थी (जैसा कि 7 और 8 पर काम करता है)। –

+0

ऊपर से धन्यवाद, धन्यवाद – Ozrix

1

यह संरचना DELAYEDEXPANSION

@ECHO OFF 
SETLOCAL 
FOR %%i IN (A B C D) DO (
SET destcall=BADCHOICE 
choice /c QJ /M "%%i - choose Q or J" 
IF ERRORLEVEL 1 SET destcall=CHOSEQ 
IF ERRORLEVEL 2 SET destcall=CHOSEJ 
CALL CALL :%%destcall%% 
) 
GOTO :eof 

:badchoice 
ECHO bad choice 
GOTO :eof 

:choseq 
ECHO You chose Q 
GOTO :eof 

:chosej 
ECHO You chose J 
GOTO :eof 
संबंधित मुद्दे