2013-07-01 9 views
9

मैं इस त्रुटि हो रही है पर अप्रत्याशित था:बैच फ़ाइल:। (इस बार

(was unexpected at this time

त्रुटि एक के मान स्वीकार करने के बाद होता है मैंने कोशिश की और शून्य मान कि इस तरह की समस्या का कारण बन सकता के लिए जाँच की ,, लेकिन असफल रहा था।

echo off 
cls 
title ~USB Wizard~ 
echo What do you want to do? 
echo 1.Enable/Disable USB Storage Devices. 
echo 2.Enable/Disable Writing Data onto USB Storage. 
echo 3.~Yet to come~. 

set "a=%globalparam1%" 
goto :aCheck 
:aPrompt 
set /p "a=Enter Choice: " 
:aCheck 
if "%a%"=="" goto :aPrompt 
echo %a% 

IF %a%==2 (
title USB WRITE LOCK 
echo What do you want to do? 
echo 1.Apply USB Write Protection 
echo 2.Remove USB Write Protection 
::param1 
set "param1=%globalparam2%" 
goto :param1Check 
:param1Prompt 
set /p "param1=Enter Choice: " 
:param1Check 
if "%param1%"=="" goto :param1Prompt 

if %param1%==1 (
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000001 
echo USB Write is Locked! 
) 
if %param1%==2 (
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000000 
echo USB Write is Unlocked! 
) 
) 
pause 
+1

यदि आप गूंज (पहली पंक्ति) पर बदलते हैं, तो क्या आप कुछ उपयोगी देखते हैं? –

उत्तर

20

आप उस त्रुटि हो रही है क्योंकि param1 अगर बयानों मूल्यांकन किया जाता है, परम scoped की जा रही देरी विस्तार के बिना चर के कारण हमेशा रिक्त है जब।

जब ब्रांड्स का उपयोग किया जाता है, तो उन कोष्ठक के भीतर सभी आदेश और चर का विस्तार किया जाता है। और उस समय, param1 के पास अमान्य बयान बनाने का कोई मूल्य नहीं है। देरी से विस्तार का उपयोग करते समय, चर केवल तभी विस्तारित होते हैं जब कमांड को वास्तव में बुलाया जाता है।

इसके अलावा मैं यह निर्धारित करने के लिए if not defined कमांड का उपयोग करने की सलाह देता हूं कि कोई चर सेट है या नहीं।

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
cls 
title ~USB Wizard~ 
echo What do you want to do? 
echo 1.Enable/Disable USB Storage Devices. 
echo 2.Enable/Disable Writing Data onto USB Storage. 
echo 3.~Yet to come~. 

set "a=%globalparam1%" 
goto :aCheck 
:aPrompt 
set /p "a=Enter Choice: " 
:aCheck 
if not defined a goto :aPrompt 
echo %a% 

IF "%a%"=="2" (
    title USB WRITE LOCK 
    echo What do you want to do? 
    echo 1.Apply USB Write Protection 
    echo 2.Remove USB Write Protection 

    ::param1 
    set "param1=%globalparam2%" 
    goto :param1Check 
    :param1Prompt 
    set /p "param1=Enter Choice: " 
    :param1Check 
    if not defined param1 goto :param1Prompt 
    echo !param1! 

    if "!param1!"=="1" (
     REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000001 
     echo USB Write is Locked! 
    ) 
    if "!param1!"=="2" (
     REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000000 
     echo USB Write is Unlocked! 
    ) 
) 
pause 
endlocal 
+1

+1, देरी विस्तार, ओएमजी :) – Endoro

+0

सुंदर! धन्यवाद!! =) – user2540289

4

आप अपने सभी तीन if बयान में दोहरे उद्धरण चिह्नों की जरूरत है, जैसे .:

IF "%a%"=="2" (

@echo OFF &SETLOCAL ENABLEDELAYEDEXPANSION 
cls 
title ~USB Wizard~ 
echo What do you want to do? 
echo 1.Enable/Disable USB Storage Devices. 
echo 2.Enable/Disable Writing Data onto USB Storage. 
echo 3.~Yet to come~. 


set "a=%globalparam1%" 
goto :aCheck 
:aPrompt 
set /p "a=Enter Choice: " 
:aCheck 
if "%a%"=="" goto :aPrompt 
echo %a% 

IF "%a%"=="2" (
    title USB WRITE LOCK 
    echo What do you want to do? 
    echo 1.Apply USB Write Protection 
    echo 2.Remove USB Write Protection 
    ::param1 
    set "param1=%globalparam2%" 
    goto :param1Check 
    :param1Prompt 
    set /p "param1=Enter Choice: " 
    :param1Check 
    if "!param1!"=="" goto :param1Prompt 

    if "!param1!"=="1" (
     REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000001 
     USB Write is Locked! 
    ) 
    if "!param1!"=="2" (
     REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\ /v WriteProtect /t REG_DWORD /d 00000000 
     USB Write is Unlocked! 
    ) 
) 
pause 
8

ओह, प्रिय। कुछ छोटी समस्याएं ...

जैसा कि दूसरों द्वारा इंगित किया गया है, आपको खाली/स्थान-युक्त प्रविष्टियों के खिलाफ सुरक्षा के लिए उद्धरण देने की आवश्यकता है, और देरी_एक्सपीशन का उपयोग करें! सुविधा।

दो अन्य मामलों जिनमें से आप पता होना चाहिए:

पहले, set/p एक चर करने के लिए एक उपयोगकर्ता के इनपुट मूल्य प्रदान करेंगे। यह खबर नहीं है - लेकिन गॉचा यह है कि प्रतिक्रिया में enter दबाकर वेरिएबल अनचाहे छोड़ देंगे - यह चर के लिए शून्य-लंबाई वाली स्ट्रिंग को असाइन नहीं करेगा (इसलिए पर्यावरण से चर को हटाया जा रहा है।) सुरक्षित विधि है:

set "var=" 
set /p var= 

यह निश्चित रूप से है, यदि आप मौजूदा मान को दोहराने के लिए enter नहीं चाहते हैं।
एक अन्य उपयोगी रूप

set "var=default" 
set /p var= 

या

set "var=default" 
set /p "var=[%var%]" 

है (जो कि डिफ़ॉल्ट मान के साथ संकेत देता है; !var! अगर delayedexpansion के साथ एक ब्लॉक बयान में)

दूसरा मुद्दा यह है कि है कुछ विंडोज संस्करणों पर (हालांकि W7 इस समस्या को "ठीक" करने के लिए प्रतीत होता है) कोई भी लेबल - :: comment (जो टूटा हुआ लेबल है) सहित किसी भी 'ब्लॉक' को समाप्त कर देगा - यानी, ब्रांडेडिस कंपाउंड स्टेटमेंट)

+0

+1 हैक लेबल टिप्पणियों के बारे में महान बिंदु। यहां अजीब लेबल टिप्पणी व्यवहार के बारे में एक दिलचस्प चर्चा है: http://www.dostips.com/forum/viewtopic.php?एफ = 3 और टी = 4204 –

+0

@ डेविड दिलचस्प चर्चा, लेकिन मैं इस विचार को अस्वीकार कर दूंगा कि '::' एक असफल लॉग-ड्राइव स्विच है। अगर ऐसा होता है, तो इसे ब्लॉक के बाहर एक त्रुटि को जोड़ना चाहिए। जबकि अकादमिक तर्क दिलचस्प हो सकता है, दुख की बात है कि लेबल/:: की स्थिति के संबंध में नियम और नियम - टिप्पणियां आज के औसत या आकस्मिक बैचर के ध्यान से परे दिखाई देती हैं और रखरखाव के दौरान टूटने की संभावना "चालाक" उपयोग मेरे लिए बहुत खतरनाक बनाती है स्वाद। सुनिश्चित नहीं है कि स्थिति संस्करण-निर्भर है या नहीं। मैं सैनिटी के लिए एक गैर-लेबल/:: - टिप्पणियों में एक ब्लॉक दर्शन के लिए रहूंगा। – Magoo

+0

मैं आपसे सहमत हूं। हैक लेबल टिप्पणियों को हमेशा अपने अपरिभाषित व्यवहार के कारण ब्रांड्स के अंदर से बचा जाना चाहिए। चर्चा सिर्फ उन लोगों के लिए थी जो व्यवहार के बारे में अधिक पढ़ना चाहते थे और उनका उपयोग करना बुरा क्यों था। –