2013-04-24 10 views
38

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

सेट var = reg क्वेरी HKLM \ SOFTWARE \ मैक्रोमीडिया \ FlashPlayer \ CurrentVersion>

या

reg क्वेरी एचकेएलएम \ सॉफ़्टवेयर \ मैक्रोमीडिया \ फ्लैशप्लेयर \ CurrentVersion >> सेट var

हाँ, जैसा कि आप देख सकते हैं कि मैं थोड़ा खो गया हूं। छोटी या बडी सब तरह की मदद सराहनीय है!

+0

यदि नीचे दिए गए उत्तरों की मदद नहीं की गई, तो Google पर पुनर्निर्देशन खोजें। –

+0

[बैश बैकटिक्स के बराबर बैच के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/2768608/batch-equivalent-of-bash-backticks) –

+0

असल में मूल लगता है [मैं कैसे परिणाम प्राप्त करूं विंडोज़ में एक चर में कमांड?] (http://stackoverflow.com/q/108439/12892)। –

उत्तर

79

पद्धति पहले से ही तैयार किया गया है, लेकिन इस तरह से आप एक अस्थायी फ़ाइल जरूरत नहीं है।

for /f "delims=" %%i in ('command') do set output=%%i 

हालांकि, मुझे यकीन है कि इसके अपने अपवाद और सीमाएं हैं।

+0

बहुत बढ़िया, मदद के लिए धन्यवाद! – user2283234

+2

यदि यह आपके प्रश्न का समाधान करता है तो कृपया इसे स्वीकार के रूप में चिह्नित करें। –

+2

मुझे '%% मिलता है मैं इस समय अप्रत्याशित था। 'परिणामस्वरूप जब मैं उपरोक्त आदेश निष्पादित करता हूं। यकीन नहीं है कि क्यों। –

9

This post इस

से

(zvrba) आपने किसी फ़ाइल का उत्पादन पुनः निर्देशित पहली से यह कर सकते हैं प्राप्त करने के लिए एक विधि है। उदाहरण के लिए:

echo zz > bla.txt 
set /p VV=<bla.txt 
echo %VV% 
1

आप एक वर में सीधे एक प्रक्रिया उत्पादन असाइन नहीं कर सकते, तो आप एक के लिए/एफ पाश के साथ उत्पादन पार्स करने के लिए की जरूरत है:

@Echo OFF 

FOR /F "Tokens=2,*" %%A IN (
    'Reg Query "HKEY_CURRENT_USER\Software\Macromedia\FlashPlayer" /v "CurrentVersion"' 
) DO (
    REM Set "Version=%%B" 
    Echo Version: %%B 
) 

Pause&Exit 

http://ss64.com/nt/for_f.html

पुनश्च: अगर इस्तेमाल किया reg कुंजी बदलें जरूरत है।

1

यहाँ ठीक है के उपयोग के लिए के लिए कुछ और अधिक जटिल नमूना/एफ

:: Main 
@prompt -$G 
    call :REGQUERY "Software\Classes\CLSID\{3E6AE265-3382-A429-56D1-BB2B4D1D}" 

@goto :EOF 

:REGQUERY 
:: Checks HKEY_LOCAL_MACHINE\ and HKEY_CURRENT_USER\ 
:: for the key and lists its content 

    @call :EXEC "REG QUERY HKCU\%~1" 
    @call :EXEC "REG QUERY "HKLM\%~1"" 

@goto :EOF  

:EXEC 
    @set output= 

    @for /F "delims=" %%i in ('%~1 2^>nul') do @(
     set output=%%i 
    ) 

    @if not "%output%"=="" (
     echo %1 -^> %output% 
    ) 

@goto :EOF 

मैं इसे उप समारोह में पैक: EXEC तो कार्यान्वयन के अपने बुरा पूरे विवरण को नहीं है litters मुख्य लिपि तो इसे कुछ बैच ट्यूटोरियल मिला। नोट्स 'मुक्केबाज़ी कोड:

  1. आदेश कॉल के माध्यम से निष्पादित से उत्पादन: EXEC आदेश में % उत्पादन% संग्रहित है। बैच cmd scopes की परवाह नहीं करता है इसलिए% output% मुख्य स्क्रिप्ट में भी उपलब्ध होगा।
  2. @ शुरुआत केवल सजावट है और कमांड लाइन को प्रतिबिंबित करने के लिए वहां दबाने के लिए है। आप उन्हें सभी हटा सकते हैं और केवल @echo को से पहले पंक्ति में वास्तव में नापसंद कर सकते हैं। हालांकि इस तरह मुझे डिबगिंग बहुत अच्छा लगता है। सजावट संख्या दो प्रॉम्प्ट - $ जी है।यह कमांड प्रॉम्प्ट इस की तरह लग रहे बनाने के लिए नहीं है - मैं % में ::के बजाय रेम
  3. टिल्ड (~) का उपयोग>
  4. ~ 1 पहला तर्क
  5. से बोलियां दूर करने के लिए है
  6. 2 ^> nulstderr त्रुटि आउटपुट को दबाने/त्यागने के लिए है। आम तौर पर आप इसे 2> nul के माध्यम से करेंगे। खैर ^ बैच एस्केप चार पुनर्निर्देशक (>) को जल्दी से हल करने से बचाता है। स्क्रिप्ट में थोड़ी देर बाद कुछ अनुकरण का उपयोग किया जाता है: echo %1 -^>... इसलिए^^ आउटपुट को आउटपुट के माध्यम से '>' संभव बनाता है और क्या संभव नहीं होता।
  7. भले ही @if not "%output%"=="" की तुलना सबसे आम प्रोग्रामिंग भाषाओं की तरह दिखती है - यह संभवतः अलग है (यदि आप एमएस-बैच में उपयोग नहीं किए जाते हैं)। शुरुआत में '@' को हटा दें। उत्पादन का अध्ययन करें। इसे not %output%=="" -rerun में बदलें और विचार करें कि यह क्यों काम नहीं करता है। ;)
संबंधित मुद्दे