बैच फ़ाइल में चर में फ़ाइल सामग्री कैसे पढ़ें?


161

यह बैच फ़ाइल TEST से LIVE तक एक बिल्ड रिलीज़ करती है। मैं इस फ़ाइल में एक चेक बाधा जोड़ना चाहता हूं जो यह सुनिश्चित करता है कि एक विशिष्ट फ़ोल्डर में एक साथ जारी दस्तावेज़ है।

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

इसलिए मेरे पास इस बारे में कुछ सवाल हैं कि इसे कैसे प्राप्त किया जाए ...

  1. फ़ोल्डर version.txtमें एक फ़ाइल है \\testserver\testapp$, और इस फ़ाइल की एकमात्र सामग्री बिल्ड नंबर है (उदाहरण के लिए, 45 - बिल्ड 45 के लिए) मैं version.txtफ़ाइल की सामग्री को बैच फ़ाइल में चर में कैसे पढ़ूं?

  2. मैं कैसे चेक करूं कि कोई फ़ाइल, \\fileserver\myapp\releasedocs\ {build}.doc{build} के स्थान पर चर 1 से चर का उपयोग कर रही है?

जवाबों:


300

एक चर में फ़ाइल सामग्री पढ़ें:

for /f "delims=" %%x in (version.txt) do set Build=%%x

या

set /p Build=<version.txt

दोनों फ़ाइल में केवल एक ही लाइन के साथ कार्य करेंगे, अधिक लाइनों के लिए वैरिएबल अंतिम रेखा को चर में forडाल देगा , जबकि पहले का उपयोग करेगा set /p

चर का उपयोग करना - किसी भी अन्य पर्यावरण चर की तरह - यह एक है, सब के बाद:

%Build%

तो अस्तित्व की जांच करने के लिए:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

हालांकि यह अच्छी तरह से हो सकता है कि वहां कोई भी UNC रास्तों की अनुमति न हो। अभी इसका परीक्षण नहीं कर सकते हैं लेकिन इसे ध्यान में रखें।


4
setविधि केवल 1024 अक्षर के बारे में लिखा है, ऐसा क्यों है?
इयूलियन ओनोफ्रेई

12
शायद एक बफर की सीमा के कारण cmd। यह विश्वसनीय लिपियों के लिए एक भयानक भाषा है।
जॉय

मुझे पता है, मैंने एक फ़ाइल में स्ट्रिंग को बदलने के लिए घंटों संघर्ष किया: |
इयूलियन ओनोफ्रेई

16
@ इयूलियनऑनफ्रेई, 1023 विस्तृत वर्ण (2046 बाइट्स) को पढ़ने के लिए स्टैक आवंटित बफ़र के साथ set /pकॉल करता है cmd!ReadBufFromInput। यह फ़ाइल से 1023 बाइट्स पढ़ता है, प्रति ओईएम / एएनएसआई चरित्र 1 बाइट मान लेता है, लेकिन यह वर्तमान कोडपेज का उपयोग करके फाइल को डीकोड करता है, जो जरूरी नहीं कि ओईएम / एएनएसआई है। सबसे खराब स्थिति कोडपेज 65001 और 4-बाइट UTF-8 अक्षरों (जैसे एक प्राचीन लिपि) से भरी हुई फ़ाइल है। आपको 255 वर्ण मिलेंगे, साथ ही एक आंशिक रूप से डिकोड किए गए वर्ण को प्रतिस्थापन चरित्र, U + FFFD के रूप में संग्रहीत किया जाएगा।
Eryk Sun

3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") ...help forइसका उल्लेख करता है, वैसे।
जॉय

46

आप इस तरह फ़ाइल से कई चर पढ़ सकते हैं:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

जहां param.txt:

PARAM1=value1
PARAM2=value2
...

1
यह सही समाधान है। सचमुच ओपी जवाब देने के लिए, (param.txt)होना चाहिए (version.txt)और इसे शामिल करना चाहिएBuild=45
robotik

यह वह जगह है समाधान।
जेल

3
%% G इस समय अप्रत्याशित था।
जॉन

4
@ जॉन: सीधे कमांड लाइन पर उपयोग के लिए, हर की जगह %%Gके साथ%G
स्टीफ़न

32

बस करो:

type version.txt

और यह प्रदर्शित किया जाएगा जैसे कि आपने टाइप किया है:

set /p Build=<version.txt
echo %Build%

4
@ जेब मुझे पता है कि लेकिन मैं अभी भी टाइप कमांड के लिए आभारी हूं क्योंकि मुझे जो चाहिए
MSM

प्रकार संस्करण प्रदान करने के लिए धन्यवाद। ठीक उसी तरह काम करता है जिसकी मुझे जरूरत है, एक साझा निर्देशिका पर फ़ाइल सामग्री तक पहुँचने की।
Tastybrownies

22

चर में भरी गई फ़ाइल की सभी पंक्तियों को प्राप्त करने के लिए, विलंबित विस्तार की आवश्यकता है, इसलिए निम्न कार्य करें:

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

कुछ विशेष पात्रों के साथ एक समस्या है, हालांकि विशेष रूप से ;, %और!


setडबल-कोट्स के भीतर पूरी अभिव्यक्ति को शामिल करने से कम से कम कुछ विशेष पात्रों के साथ समस्याओं से बचा जा सकता है set "Build=!Build!%%x":।
asipipfl

9
मेरी स्क्रिप्ट बस "इको ऑन है" प्रिंट करती है। बैच पूरा कचरा क्यों है?
ट्रेवर हिक्की

बिना विलंबित विस्तार के मेरे लिए काम करता है: set err=(अगली पंक्ति)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

2
बैच पूरा कचरा क्यों है? ...स्थिरता के लिए?
Jan Nielsen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.