2016-04-01 8 views
5

मुझे एक बैच फ़ाइल बनाने की आवश्यकता है जो कुछ आईपी ट्रैकर कमांड का उपयोग करके पता लगाए, और txt फ़ाइलों को ट्रेस लिखें। मैं इसे तेज़ होना चाहता हूं इसलिए मैं प्रत्येक ट्रेस के लिए एक नया आदेश शुरू करना चाहता हूं ताकि सभी ट्रेस अनुरोध एक बार शुरू हो जाएं।बैच - बैच में txt फ़ाइल को सिंक्रनाइज़ करने के लिए कोई तरीका है?

मेरी ping.bat है:

@echo off 
set saveUnrechableLocation=..\pingUnreachableInfo\pingUnrechableInfoDB.txt 
set IpListLocation=..\ipInfo\all_DB_ip.txt 
set reachableLocation=..\pingRechableInfo\RechableIp\pingRechableInfoDB.txt 
set trace=..\pingRechableInfo\tracert\tracertDB.txt 
set numberOfPings=1 
@echo pinging DB > %saveUnrechableLocation% 
copy /y NUL %reachableLocation% > NUL 
copy /y NUL %trace% > NUL 
for /F "tokens=*" %%A in (%IpListLocation%) do (
    ping -n %numberOfPings% %%A | find "TTL=" >nul 
    if errorlevel %numberOfPings% (
     @echo %%A not rechable >> %saveUnrechableLocation% 
    ) 
    if not errorlevel %numberOfPings% (
    @echo %%A >> %reachableLocation% 
    start trace.bat %trace% %%A 
    ) 
) 

और उस तरह लग रहे trace.bat:

@echo off 
set saveLocation=%~1 
set ip=%~2 
tracert %ip% >> %saveLocation% 
exit 

समस्या यह है कि जब मैं इस मैं हो रही है उपयोग करने के लिए कोशिश कर रहा हूँ है इस समस्या:

प्रक्रिया फ़ाइल क्योंकि यह अन्य प्रक्रिया द्वारा किया जा रहा है उपयोग नहीं कर सकते

इस समस्या को हल करने के लिए मैं क्या कर सकता हूं? धन्यवाद!

उत्तर

5

विंडोज पुनर्निर्देशन कई प्रक्रियाओं को एक ही समय में लिखने के लिए एक ही फ़ाइल खोलने की अनुमति नहीं देता है। लेखन संचालन क्रमबद्ध होना चाहिए। यह बैच प्रसंस्करण के साथ किया जा सकता है, जैसा कि https://stackoverflow.com/a/9344547/1012053 पर प्रदर्शित किया गया है। हालांकि, मुझे नहीं लगता कि समाधान आपके मामले में मदद करेगा।

प्रत्येक ट्रैकर प्रक्रिया में काफी समय लगता है, और आउटपुट को पूरे समय रीडायरेक्ट किया जाना चाहिए। लेकिन आप एक ही समय में कई प्रक्रियाओं को चलाना चाहते हैं, सभी आउटपुट उसी फ़ाइल पर रीडायरेक्ट किए जाते हैं। यहां तक ​​कि यदि आप इसे काम करना चाहते थे, तो आउटपुट को अंतःस्थापित किया जाएगा, और आप यह समझने में सक्षम नहीं होंगे कि इसका क्या अर्थ है।

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

नोट आउटपुट स्थान को पास करने की कोई आवश्यकता नहीं है। प्रत्येक बच्चे की प्रक्रिया में ट्रेस वैरिएबल तक पहुंच होती है, इसलिए यह आसानी से सही स्थान पर रीडायरेक्ट कर सकता है। ping.bat की

रूपरेखा में परिवर्तन

... 
set trace=..\pingRechableInfo\tracert\tracertDB 
... 
start trace.bat %%A 
... 

टिप्पणियों के बिना trace.bat

@echo off 
tracert %1 >%trace%_%1.txt %= Redirect TRACERT to unique temp file =% 
:merge 
2>nul ( %= Hide error messages inside the outer parentheses =% 
    >>%trace%.txt ( %= Attempt stdout redirection - Fails if already locked =% 
    type %trace%_%1.txt %= Write the temp file to the merge file =% 
    (call) %= Clear any error that TYPE may have generated =% 
) 
) || goto :merge %= Loop back and try again if stdout redirection failed =% 
del %trace%_%1.txt %= Delete the temporary file =% 
exit 

एक संक्षिप्त रूप से संशोधित दिखाई देगा:

@echo off 
tracert %1 >%trace%_%1.txt 
:merge 
2>nul (>>%trace%.txt (type %trace%_%1.txt&(call)))||goto :merge 
del %trace%_%1.txt 
exit 
+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! मुझे नहीं पता था कि मैं इस तरह के ट्रेस var पर जा सकता हूं। केवल 2 सरल प्रश्न: 1. ट्रेसर से आपका मतलब ट्रेस है? क्योंकि मैंने ट्रैसर नामक एक var नहीं बनाया है। मैं बैच लिखने के लिए नया हूं, यह लाइन क्या कर रही है? "2> नूल (प्रकार% tracer% _% 1.txt >>% tracer% .txt)" – Moshe9362

+1

@ Moshe9362 - 1) ओह! हां, मेरा मतलब "ट्रेस" वैरिएबल लिखना था, न कि ट्रैसर। 2) अद्यतन उत्तर देखें। ध्यान दें कि '% = यह एक टिप्पणी =%' है। मैंने एक वाक्यविन्यास त्रुटि बग तय किया है, साथ ही साथ एक गूढ़ बग जो अंतहीन पाश का कारण बन सकता है यदि किसी कारण से temp फ़ाइल मौजूद नहीं है। – dbenham

+0

असल में, यह काम नहीं कर रहा है। यह 'tracertDB_10.0.0.1.txt' जैसी फ़ाइलें बनाते हैं लेकिन प्रक्रिया प्रक्रिया के बाद उन्हें हटा नहीं दिया गया है, यह ट्रेस को tracertDB.txt पर कॉपी नहीं करता है और cmd-tracert कमांड से बाहर नहीं निकलता है। कोई उपाय? – Moshe9362

1

यह है स्थिर डीबेनहम उत्तर पर आधारित कोड:

@echo off 
tracert %1 >%trace%_%1.txt 
:merge 
2>nul (
    >>%trace%.txt ( 
     type %trace%_%1.txt 
      (call) 
    ) 
) ||goto :merge 
del %trace%_%1.txt 
exit 
संबंधित मुद्दे