विंडोज बैच फ़ाइल में स्ट्रिंग का हिस्सा कैसे निकालें?


30

मान लीजिए कि मेरे पास "Abc_123" जैसे एक मान है जो एक बैच (cmd) फ़ाइल में एक चर में संग्रहीत है। मैं एक चर के साथ समाप्त करना चाहता हूं जिसमें केवल "123" शामिल है। क्या ऐसा करने का कोई अंतर्निहित तरीका है?

जब तक यह एक विशिष्ट विंडोज (विस्टा / 2008) प्रणाली में बनाया गया है, तब तक मैं इस विधि, या प्रदर्शन के बारे में बहुत कम नहीं हूं।

जवाबों:


40

विकल्प सिंटैक्स का उपयोग करें:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123

4
आप पूर्ण सिंटैक्स को देख सकते हैं help setजैसा कि एक बैच फ़ाइल में सबस्ट्रिंग करने का सबसे अच्छा तरीका क्या है? StackOverflow पर।
प्रयोक्ता ५

1
अगर मुझे चर इनपुट के लिए 4 और 3 की आवश्यकता है, तो मैं यह कैसे करूंगा? %string:~%start%,%len%%
19

कोई बात नहीं। मुझे जवाब मिल गया। ss64.com/nt/syntax-substring.html
MakPo

3
@MakPo: से लिंक को संक्षेप में प्रस्तुत करने के लिए CALL, जैसेCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
Bugybunny

8

यदि आप केवल अंडरस्कोर के बाद सब कुछ चाहते हैं (और जरूरी नहीं कि स्ट्रिंग की लंबाई या जहां अंडरस्कोर है, लेकिन वहां केवल एक अंडरस्कोर होने पर भरोसा कर सकते हैं), कोशिश करें:

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

मूल रूप से, आपका स्ट्रिंग एक सीमांकक के रूप में अंडरस्कोर का उपयोग करके टोकन में विभाजित हो जाएगा (delims = _)। लूप के लिए केवल दूसरा वाला (टोकन = 2) पास किया जाएगा (चर %% a)। लूप केवल एक बार चलेगा क्योंकि आप इस मामले में एक स्ट्रिंग के साथ काम कर रहे हैं।

यदि आप अंडरस्कोर से पहले और बाद में दोनों सामान बचाना चाहते हैं, तो कोशिश करें:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

ध्यान दें कि %% a विभाजन के पहले टोकन के लिए चर है; %% बी विभाजन के दूसरे टोकन के लिए चर है।


3

यदि आप पाते हैं कि बैच भाषा इतनी शक्तिशाली नहीं है कि आप क्या चाहते हैं - और यह संभवत: आपको उस बिंदु तक पहुंचने में बहुत समय नहीं लगेगा - आप Windows PowerShell का उपयोग कर सकते हैं । यह विंडोज के सभी संस्करणों पर डिफ़ॉल्ट रूप से स्थापित नहीं है, लेकिन आप इसे नि: शुल्क डाउनलोड कर सकते हैं।

यदि आपको PowerShell भाषा पसंद नहीं है, तो वहाँ पर्ल है। आपको इसे सभी प्रणालियों पर स्थापित करना होगा। दूसरे भी हैं।


प्रश्न पॉवर्सशेल या पर्ल के बारे में नहीं पूछ रहा है
जोम्बा

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
यह विशेष रूप से क्या करता है?
पिंप जूस आईटी

ओह, अगर आप पूछ रहे थे कि यह कोड कैसे काम करता है: यह नंबर से पहले सब कुछ हटा देता है, एक अंडरस्कोर से पहले।
जोम्बा

@Zimba वहाँ केवल "अंतिम _" के लिए इसे बढ़ाने का एक तरीका है? इसके अलावा, मैं इसे किसी भी दस्तावेज में कहां मिल सकता हूं?
ट्वीस्टरेब

ठीक है, एक डॉक्स मिला, जवाब देने के लिए जोड़ा गया। प्रश्न अभी भी खड़े हैं: मैं *लालची कैसे बनाऊं? मैंने अच्छे ओल का इस्तेमाल किया IF NOT ... GOTO :replace, लेकिन बेहतर तरीका होगा तो अच्छा होगा।
ट्वीस्ट्रोब

1
@TWiStErRob: मैं देख रहा हूं। आप नहीं जानते कि कितने _पिछले एक है, तो करने के लिए देखते हैं, तो पाशset var
Zimba
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.