मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन यहाँ एक समान मुद्दे के साथ किसी के लिए कुछ अतिरिक्त जानकारी है ...
ली, क्यों "%% एक" बाहर काम नहीं कर रहा पर अपने तर्क लूप के लिए सही है। % ए-जेड और% ए-जेड चर (बैच फ़ाइल के अंदर %% ए-जेड) लूप के लिए एक निर्माण है, और इसके बाहर मौजूद नहीं है।
मैं इस समस्या के वैकल्पिक समाधान की सिफारिश करना चाहता हूं जो सही रेखा संख्याओं से मेल खाता है (कोई खाली लाइन नहीं छोड़ी गई है) और देरी विस्तार, काउंटर या गोटो स्टेटमेंट की आवश्यकता नहीं है। निम्नलिखित कोड पर एक नज़र डालें:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "c:\file_list.txt"') do if "%%a"=="%1" set line=%%b
echo.%line%
यहां मुझे उपर्युक्त परिवर्तनों का कारण बताया गया है।
Some text on line 1
Blah blah blah
More text
मैंने सोचा परिवर्तन था: मान लीजिए कि आप निम्न फ़ाइल सामग्री पड़ा करते हैं।: करें.अभियान (ग \ file_list.txt) ('findstr/n * "c: \ file_list.txt "')।
- 'findstr/एन। * "पथ \ FILENAME"' फ़ाइल हर पंक्ति (करने के लिए पढ़ता है और कहते हैं एक लाइन नंबर ('/एन') '। *' एक रेगुलर एक्सप्रेशन है किसी भी चरित्र के "0 या अधिक" से मिलान करना)। चूंकि प्रत्येक पंक्ति में अब शुरुआत में एक लाइन नंबर होगा (यहां तक कि खाली वाले), लूप के लिए कोई लाइन नहीं छोड़ी जाएगी।
प्रत्येक पंक्ति पाश के लिए अंदर इस तरह दिखेगा:
1:Some text on line 1
2:Blah blah blah
3:More text
इसके बाद, हम "टोकन = 1 * delims =:" का उपयोग लाइन नंबर और सामग्री को तोड़ने के लिए।
- 'टोकन = 1 *' यह बाद सब कुछ करने के लिए पहले टोकन सीमांकक से पहले सब कुछ करने के लिए (%% एक में संग्रहीत), और दूसरा टोकन (%% ख में संग्रहीत) सेट ।
- 'delims =:' सेट ":" स्ट्रिंग को तोड़ने के लिए उपयोग किए जाने वाले डेलीमीटर चरित्र के रूप में।
अब हम फ़ाइल के माध्यम से लूप के रूप में, %% एक वर्तमान लाइन नंबर वापस आ जाएगी और %% ख है कि रेखा की सामग्री वापस आ जाएगी।
अब सिर्फ़ % 1 पैरामीटर को %% एक (एक काउंटर चर के बजाय) की तुलना करने और %% ख का उपयोग वर्तमान पंक्ति सामग्री को संग्रहीत करने के लिए है: अगर "%% एक" == "% 1" सेट लाइन = %% बी।
एक अतिरिक्त बोनस यह है कि 'enableelayedexpansion' अब आवश्यक नहीं है, क्योंकि उपरोक्त कोड लूप के बीच में काउंटर वैरिएबल पढ़ने को समाप्त करता है।
संपादित करें: '। गूंज% पंक्ति%' में बदल दिया 'गूंज% पंक्ति%'। यह "ईसीएचओ बंद है" के बजाय, अब रिक्त रेखाएं सही ढंग से प्रदर्शित करेगा। बदल दिया 'टाइप c: \ file_list.txt^| findstr/n। * 'to' findstr/n। * "c: \ file_list.txt" ', findstr कमांड पहले से ही फ़ाइलों को सीधे पढ़ सकता है।
जेब, मुझे लगता है कि मैंने सभी विशेष चरित्र मुद्दों को हल किया है। इस एक शॉट दे दो:
for /f "tokens=*" %%a in ('findstr /n .* "c:\file_list.txt"') do (
set "FullLine=%%a"
for /f "tokens=1* delims=:" %%b in ("%%a") do (
setlocal enabledelayedexpansion
set "LineData=!FullLine:*:=!"
if "%%b" equ "%1" echo(!LineData!
endlocal
)
)
ध्यान दें कि 'for/f' खाली लाइनों को छोड़ देगा। यह कुछ मामलों में आपकी गिनती को फेंक देगा और शायद। – Joey