क्या मैं बैच फ़ाइलों को अधिक कुशलता से केंद्रीकृत कर सकता हूं? [बन्द है]


1

मैं बैच स्क्रिप्टिंग की दुनिया में नया हूँ इसलिए बुनियादी सवालों के रूप में जो भी प्रकट हो सकता है उसे क्षमा करें। मैं सीख रहा हूं क्योंकि मुझे अलग-अलग काम सौंपे जाते हैं और मैं स्वचालन का एक बड़ा प्रस्तावक हूं जहां संभव है। मेरे पास कई बैच फाइलें हैं जो कई कार्य करती हैं। इन फ़ाइलों में से प्रत्येक का पथ हार्ड-कोडित था जैसे c: \ temp। d: \ data, आदि बैच फ़ाइल में। प्रारंभ में मैंने इन्हें एक टेक्स्ट फ़ाइल में स्थानांतरित कर दिया, जिसे मैं एक बैच फ़ाइल उदा से कॉल कर सकता था

for /f "tokens=1,2 delims==" %%R in (config.txt) do ( 
if %%R==bdata set bdata=%%S
if %%R==cdata set cdata=%%S
)

Config.txt फ़ाइल में ये मान हैं

bdata=c:\temp
cdata=d:\data

मुझे एहसास हुआ कि हर बार मुझे एक नया चर बनाने की आवश्यकता होगी, मुझे config.txt फ़ाइल के साथ-साथ config.bat फ़ाइलों को भी अपडेट करना होगा।

मैंने तय किया कि मैं सभी मानों को केवल config.bat फ़ाइल में निम्नानुसार स्थानांतरित करूंगा

set bdata=c:\temp
set cdata=d:\data

मैंने तब मौजूदा बैच फ़ाइलों में से प्रत्येक को हार्ड-कोडेड पथों के बजाय चर को कॉल करने के लिए अद्यतन किया। मैंने config.bat को छोड़कर प्रत्येक बैच फ़ाइल में कोड की निम्न पंक्तियाँ भी जोड़ी हैं। Config.bat फ़ाइल में जोड़ी गई एकमात्र अतिरिक्त पंक्ति है @echo off

@echo off    

setlocal enableextensions enabledelayedexpansion

call config.bat

मेरे पास एक और बैच फ़ाइल है जो सभी बैच फ़ाइलों को क्रम से कॉल करने को केंद्रीकृत करती है। इस बैच फ़ाइल का नाम start.bat है। मैं जो प्रयोग कर रहा हूं start /wait, वह इसलिए है क्योंकि जहां delete.batपहले रन compress.batखत्म करने का मौका मिला है , वहां के उदाहरण हैं ।

start /wait compress.bat
start /wait validate.bat
start /wait delete.bat

प्रशन

  1. क्या यह मूल्यों को केंद्रीकृत करने का सबसे अच्छा तरीका है और यदि नहीं, तो बेहतर तरीका क्या है?
  2. क्या मुझे setlocal enableextensions enabledelayedexpansionसभी मौजूदा बैच फ़ाइलों में निर्दिष्ट करने की आवश्यकता है ?
  3. क्या सभी बैच फ़ाइलों के पास @echo बंद होना चाहिए या यह मात्र config.bat फ़ाइल के लिए पर्याप्त है?
  4. है start /waitसबसे अच्छा तरीका है एक से अधिक फ़ाइलों कॉल करने के लिए? क्या मैं उक्त कमांड का उपयोग करके एक बैच फ़ाइल से दूसरे में मान पारित कर सकता हूं?
  5. सभी बैच फ़ाइलों में अलग-अलग फ़ंक्शन होते हैं जैसे कि मूव, डिलीट, आदि हालांकि %% a या %% b का उपयोग करते हैं। यह ठीक है?

उदाहरण के लिए

validate.batफ़ाइल कोड है

for %%a in (%bdata%\*.*) do if "%%~xa" == "" move /Y "%bdata%\%%~xa" "%bdata%\%done%"  

और delete.bat fileकोड है

for %%a in (%bdata%\*.*) do if "%%~xa" == ".txt" del "%%a"

मैं आपको WScript का उपयोग करके बैच फ़ाइलों से आगे बढ़ने की सलाह दूंगा ... यह आपको स्क्रिप्ट में बहुत उन्नत सामान शामिल करने में सक्षम करेगा
tumchaaditya

जवाबों:


1
  1. यह बुरा नहीं है, लेकिन अगर बाहरी बैच-फाइलें सरल हैं, तो आप उनके कोड को मुख्य बैच-फाइल में सबरूटीन्स के रूप में डाल सकते हैं और बस उनके लेबल को कॉल कर सकते हैं। उदाहरण के लिए:

    These four files:
    
    ::main.bat:
    @echo off
    call compress.bat …
    call validate.bat …
    call delete.bat …
    
    ::compress.bat:
    @echo off
    7z a -tzip -mx9 -blah -blah %1.zip
    
    ::validate.bat:
    @echo off
    7z t %1.zip
    
    ::delete.bat:
    @echo off
    delete "%1"
    
    
    Become one:
    
    ::main.bat:
    @echo off
    
    :start
      call compress …
      call validate …
      call delete …
    goto :eof
    
    :compress
      7z a -tzip -mx9 -blah -blah %1.zip
    goto :eof
    
    :validate
      7z t %1.zip
    goto :eof
    
    :delete.bat
      delete "%1"
    goto :eof
    
  2. आपको केवल जरूरत है enableextensionsऔर / या enabledelayedexpansionयदि आप उनका उपयोग करने जा रहे हैं। मुझे नहीं पता कि आपके बैच फ़ाइलों में क्या है, लेकिन यदि आप नहीं हैं, तो आप उन्हें छोड़ सकते हैं।

  3. आपको बाहरी बैच-फ़ाइलों में उनका उपयोग करने की आवश्यकता नहीं है यदि आप उन्हें एक दूसरे से कर सकते हैं जो गूंज बंद कर देता है, लेकिन यह मानक हेडर के रूप में शामिल करने के लिए एक अच्छी आदत है, विशेष रूप से बैच-फ़ाइलों के लिए जिन्हें आप कॉल कर सकते हैं स्वयं (उदाहरण के compress.batलिए कमांड-प्रॉम्प्ट से मैन्युअल रूप से कॉल करना)। वहाँ बहुत कम परिदृश्य हैं जहाँ आप विशेष रूप से चाहते हैं / इसे शामिल नहीं करने की आवश्यकता है।

  4. आप उपयोग कर सकते हैं start /wait, लेकिन बस एक बाहरी फ़ाइल को कॉल करके स्वचालित रूप से इसके डिफ़ॉल्ट रूप से लौटने की प्रतीक्षा करता है, इसलिए यह आवश्यक नहीं होना चाहिए। आप आमतौर पर बैच फ़ाइल से GUI प्रोग्राम को कॉल करते समय इसका उपयोग करना चाहते हैं। इसके अलावा, कॉलिंग startटार्गेट तर्कों को उलझा देती है ताकि केवल callउन्हें निपटाया जा सके।

  5. संभावना से अधिक, हाँ। लूप पैरामीटर लूप के लिए स्थानीय होते हैं for, इसलिए अन्य बैच-फ़ाइल उन्हें तब तक नहीं देखेंगे जब तक कि वे forलूप नहीं होते हैं, और तब भी, केवल लूप में ही:

    C:\t>type baz.bat
    @for %%a in (1) do call foobar.bat %%a
    
    C:\t>type foobar.bat
    @echo off
    echo %1
    echo %%a
    for %%a in (1) do echo %%a
    echo %%a
    
    C:\t>baz.bat
    
    C:\t>call foobar.bat 1
    1
    %a
    1
    %a
    
    C:\t>
    

विस्तृत प्रतिक्रिया के लिए धन्यवाद। जब आप पास कर सकते हैं तो समझने का प्रयास किया गया है %1। मेरी समझ यह है कि यह उपयोगकर्ता द्वारा इनपुट किया गया मूल्य है। स्पष्ट रूप से यह बताते हुए कई उदाहरण नहीं देखे गए। दूसरी बात फिर मैं एक विस्तृत की समझ में नहीं है enableextensionsऔर enabledelayedexpansion। मेरे द्वारा मेरे प्रश्न पोस्ट करने से पहले आपके द्वारा उद्धृत किए गए उदाहरणों को मैंने पढ़ा था, लेकिन मैंने उन्हें केवल इसलिए शामिल किया क्योंकि मुझे एक पोस्ट के दौरान एक फ़ाइल के भीतर चर कहते हुए उनका उपयोग करने की सूचना मिली थी।
मूँगफली के दाने

कारण मैं प्रयोग किया जाता है start /waitपर मेरी समस्या के कारण था superuser.com/questions/465985/...
PeanutsMonkey

आपका क्या मतलब है unless they happen to have a for loop? मैं अपनी लगभग सभी बैच फ़ाइलों में forलूप्स रखता हूं, इसलिए मैं इसे लेता हूं कि मैं एक ही चर नाम का उपयोग करके मुद्दों में चला सकता हूं। आप इस मुद्दे को कैसे दूर करते हैं अगर आपके पास कई forछोरें हैं।
मूँगफली के दाने

पुन: %1आप करीब हैं; %1सिर्फ बैच-फ़ाइल का पहला तर्क है ( argv[1]यदि आप सी जानते हैं)। इसे उपयोगकर्ता द्वारा कमांड-लाइन पर, या callकिसी अन्य बैच-फ़ाइल द्वारा पारित किया जा सकता है । आप "% 1" पास नहीं करते हैं; आप लक्ष्य बैच-फ़ाइल को कॉल करते हैं और उस डेटा को जोड़ते हैं जिसे आप कॉल में पास करना चाहते हैं, फिर लक्ष्य बैच-फ़ाइल में आप %1उस डेटा को एक्सेस करने के लिए उपयोग करते हैं। आप हो सकता है यदि आप विशेष रूप से दूसरे बैच-फाइल करने के लिए पहली फ़ाइल के (प्रथम) तर्क पारित करने के लिए करना चाहता था एक से दूसरे बैच-फ़ाइल से% 1 से पारित है, लेकिन फिर एक दूसरे में, यह हो सकता है मैप नहीं करने के लिए %1, यह हो सकता है %2या कुछ और अन्य।
Synetech

1
पुन:, startआपको startwincp को कॉल करने के लिए उपयोग करना होगा क्योंकि यह एक अलग प्रोग्राम है जो चलता रहता है लेकिन रिटर्न करता है, इसलिए बैच-फ़ाइल जारी रहती है। का उपयोग करके start, बैच-फ़ाइल जिसे इसे कहा जाता है वह प्रक्रिया को समाप्त करने के लिए प्रतीक्षा करता है (इसमें किसी भी विंडो को शामिल करता है)। आपको startबैच फ़ाइल में उपयोग करने की आवश्यकता है जो wincp को कॉल करता है, लेकिन बैच-फ़ाइल में नहीं जो बैच-फ़ाइल को कॉल करता है जो wincp को कॉल करता है क्योंकि पहला बैच-फ़ाइल दूसरे के लिए स्वचालित रूप से समाप्त होने की प्रतीक्षा करता है, इसलिए यदि आप उपयोग करना शुरू करते हैं wincp के समाप्त होने की प्रतीक्षा करने वाला दूसरा, फिर पहली फ़ाइल स्वचालित रूप से रोक दी जाती है।
Synetech
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.