2014-05-08 5 views
13

मैं सभी बैकस्लैश() को एक चर में स्लैश (/) को आगे बढ़ाने की कोशिश कर रहा हूं जिसमें फ़ाइल नाम और स्थान शामिल है। मैं इस बारे में पढ़ा है और देखी गई:विंडोज बैच फ़ाइल में स्लैश अग्रेषित करने के लिए बैकस्लैश बदलें

%variable:str1=str2% 

और

set "var=%var:\=/%" 

जो मैं का प्रयास किया है, लेकिन मैं स्पष्ट रूप से यह सही हो रही है नहीं कर रहा हूँ।

FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO (
    echo %%f 
    set "f=%%f:\=/%" 
    echo %%f 
    echo.     
) 

उत्पादन शो में प्रत्येक फ़ाइल नाम दो बार सूचीबद्ध:

यहाँ मेरी .bat स्क्रिप्ट के प्रासंगिक अनुभाग है।

अर्थात इस लाइन:

set "f=f:\=/%" 

नहीं कर रहा है कि क्या मैं इसे करना चाहते हैं। क्या कोई देख सकता है कि मैं क्या गलत कर रहा हूं?

+0

यह सवाल ही समाधान [आप एक बैच फ़ाइल द्वारा एफ़टीपी अपलोड में उपयोगकर्ता नाम का उल्लेख कैसे करूं] है (http://stackoverflow.com/questions/23535640/how-do-you-specify-the-username-in-ftp-upload-by-a-batch-file) – jeb

+0

क्या आप निश्चित रूप से उस प्रश्न में समाधान के बारे में सुनिश्चित हैं जो आपने लिंक किया है ? मुझे जवाब नहीं दिख रहा है, और वे मेरे लिए अलग-अलग प्रश्नों की तरह दिखते हैं। – user3253319

+0

क्षमा करें, आप सही हैं। मेरा मतलब था [बैच - कर्नल के लिए% 20 के साथ फ़ाइल नाम में रिक्त स्थान बदलना] (http://stackoverflow.com/questions/23538894/batch-replacing-spaces-in-filename-with-20-for-curl) – jeb

उत्तर

15

एक ब्लॉक बयान (a parenthesised series of statements) के भीतर, पूरे ब्लॉक पार्स किया गया है और तो मार डाला। ब्लॉक को निष्पादित करने से पहले ब्लॉक के भीतर %var% ब्लॉक को उस चर के मान द्वारा प्रतिस्थापित किया जाएगा जब ब्लॉक को - पार्स निष्पादित करने से पहले - एक ही चीज़ FOR ... DO (block) पर लागू होती है।

इसलिए, IF (something) else (somethingelse)%variables% के मानों का उपयोग करके IF के समय का उपयोग किया जाएगा।

दो आम तरीके इस पर काबू पाने के लिए 1 कर रहे हैं) setlocal enabledelayedexpansion का उपयोग करें और var की बदली हुई मूल्य का उपयोग करने की %var% के स्थान पर !var! का उपयोग करें या 2) बदली हुई मानों का उपयोग कर आगे की प्रक्रिया के प्रदर्शन करने के लिए एक सबरूटीन कॉल करने के लिए करने के लिए।

इसलिए CALL ECHO %%var%% का उपयोग नोट करें जो var के बदले गए मान को प्रदर्शित करता है।

आपके कोड में दो अलग-अलग चर शामिल हैं जिन्हें f कहा जाता है।

पहला लूप-कंट्रोल 'मेटावार्येबल' है जिसे f कहा जाता है और %%f द्वारा संदर्भित किया जाता है।

दूसरा सामान्य पर्यावरण परिवर्तनीय f है जो set "f=..." कथन द्वारा स्थापित किया गया है।यह चर %f%लेकिन का उपयोग कर एक block भीतर द्वारा पहुँचा जा सकता है, यह मूल्य यह था जब नियंत्रित करने for पार्स किया गया था बनाए रखने के लिए दिखाई देगा (वास्तव में, किसी भी %var% पार्स-समय में है कि कम से varके मान से बदल दिया गया है समय)

metavariables सबस्ट्रिंग या विकल्प, केवल आम वातावरण चर इन कार्यों के लिए इस्तेमाल किया जा सकता है जैसे स्ट्रिंग-हेरफेर बयान में नहीं किया जा सकता, इसलिए आप वातावरण चर f और को metavariable f का मूल्य निर्दिष्ट करने की जरूरत है तो स्ट्रिंग-प्रतिस्थापन कार्य का प्रदर्शन करें पर्यावरण चर f

मोड़, ज़ाहिर है कि आपको delayedexpansion और !var! वाक्यविन्यास का उपयोग ब्लॉक के भीतर एक पर्यावरण चर के संशोधित मूल्य तक पहुंचने के लिए करना चाहिए।

तो,

setlocal enabledelayedexpansion 
for...%%f...do (
    echo %%f 
    set "f=%%f" 
    set "f=!f:\=/!" 
    echo !f! 
) 
echo just for demonstration %f% !f! %%f 

यह अपेक्षित तरीके से f का मूल्य निर्धारित करता है (बेशक, आप हमेशा नाम बदल सकता है भ्रम से बचने के ...)

अंतिम पंक्ति करने के लिए है दिखाएं कि f द्वारा अधिग्रहित अंतिम मूल्य को लूप के बाहर %f% या !f! के रूप में एक्सेस किया जा सकता है, और %%f बाहर संदर्भ है और %f के रूप में दिखाया गया है।

delayedexpansion बिना यह करने के लिए एक और तरीका है

for...%%f...do (
    echo %%f 
    set "f=%%f" 
    call set "f=%%f:\=/%%" 
    call echo %%f%% 
) 
echo just for demonstration %f% !f! %%f 

अंतर call के उपयोग किया जा रहा है और दोहरीकरण % रों है, और अंतिम पंक्ति !f! के रूप में सिर्फ इतना है कि दिखाएगा - एक शाब्दिक, delayedexpansion के बाहर के बाद से मोड, !cmd पर कोई विशेष अर्थ नहीं वाला एक और चरित्र है।

+1

वाह, एक बहुत व्यापक स्पष्टीकरण, बहुत बहुत धन्यवाद! मुझे इसे कुछ बार पढ़ना पड़ा, लेकिन मुझे लगता है कि मैं इसे प्राप्त कर रहा हूं .. !! विंडोज बैच स्क्रिप्ट अभी भी मेरे लिए वास्तव में अजीब लगती है, मुझे यकीन नहीं है कि मैं कभी भी "इसे प्राप्त करूंगा" – user3253319

+0

मुझे वास्तव में रिवर्स करना था: बैकस्लैश के साथ आगे स्लैश को प्रतिस्थापित करें, लेकिन आपकी व्याख्या सही थी। –

4

यह मेरे लिए काम करने के लिए लगता है:, साथ चर substittion सिंटेक्स के रूप में देरी विस्तार को सक्षम करने के पाश चर %% च dosn 'का उपयोग कर के साथ

echo off 

setlocal enabledelayedexpansion 

FOR %%f IN ("C:\tools\workspace\*") DO (
    set old=%%f 
    echo !old! 
    set new=!old:\=/! 
    echo !new! 
    echo.     
) 

एक अलग चर का उपयोग करने के बजाय पाश चर फर्क नहीं पड़ता टी काम करने लगते हैं।

+0

शानदार, हां वह काम करता है, चीयर्स! – user3253319

32

यह बैक-स्लैश आगे-स्लैश करने के लिए एक चर में बदल जाएगा:

set "variable=E:\myfiles\app1\data\*.csv" 
set "variable=%variable:\=/%" 
echo "%variable%" 
+0

धन्यवाद। बहुत छोटा और प्यारा .. – user8162

+0

यह उत्तर लूप की आवश्यकता के बिना पूरी तरह से ठीक काम करता है। मैंने अभी कोशिश की है (मुझे उद्धरण की आवश्यकता नहीं है, हालांकि)। – ThePersonWithoutC

+2

धन्यवाद @ThePersonWithoutC - उद्धरण कुछ जहर वर्णों की रक्षा करते हैं जैसे '&' और अजीब परिस्थितियों के लिए इसे और अधिक मजबूत बनाते हैं। – foxidrive

संबंधित मुद्दे