दिलचस्प पोस्ट
Iterator :: map परिणाम निकाल देता है: Err? कैसे प्रक्रियाओं में multiples तर्क पारित करने के लिए? मैं एक SQLAlchemy संचालित अनुप्रयोग कैसे प्रोफाइल कर सकता हूं? मार्कर Google मानचित्र v2 एंड्रॉइड जोड़ते समय स्वचालित रूप से जानकारी विंडो खोलना मैं PHP के माध्यम से निष्पादित करने के लिए WKHTMLTOPDF कैसे प्राप्त करूं? मूल अजगर में नम्पी .argsort () के समतुल्य? मैं Node.js का उपयोग कर "मॉड्यूल नहीं पा सकता" त्रुटि कैसे हल कर सकता हूँ? जाँच करें कि साइट iframe के अंदर है या नहीं उप-क्लासिंग के दौरान स्थैतिक चर को ओवरराइड करना string.split – एकाधिक चरित्र सीमांकक द्वारा निष्पादक सेवा का उपयोग कर, सभी थ्रेड्स को समाप्त करने के लिए कैसे प्रतीक्षा करें? स्विफ्ट सन्दर्भ में क्या _ अंडरस्कोर प्रतिनिधि है? आप ग्लोबल / वेबग्ल के 4, 8 बिट इनट में एक 32 बिट इंट कैसे पैक करते हैं? filename.whl इस मंच पर पहिया समर्थित नहीं है समारोह सी में स्मृति 2d सरणी आवंटित करें

अन्य फ़ोल्डर पथ को सिस्टम पैथ में SEX के साथ भी क्यों जोड़ा गया है और न केवल निर्दिष्ट फ़ोल्डर पथ?

मेरे पास एक बैच फ़ाइल है जो मैं system("name.bat") का उपयोग करके C ++ से कॉल कर रहा हूं। उस बैच फ़ाइल में मैं एक रजिस्ट्री कुंजी के मान को पढ़ने की कोशिश कर रहा हूं I बैच फ़ाइल को C ++ से कॉल करने से विफल करने के लिए set KEY_NAME=HKEY_LOCAL_MACHINE\stuff

हालांकि, जब मैं सीधे बैच फ़ाइल चलाता हूं (डबल क्लिक करने पर), यह ठीक चलती है। निश्चित नहीं कि मुझसे कौन सी गलती हो रही है।

बैच फ़ाइल:

 set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Ansoft\Designer\2014.0\Desktop set VALUE_NAME=InstallationDirectory REG QUERY %KEY_NAME% /v %VALUE_NAME% 

सी ++ फ़ाइल:

 int main(void) { system("CALL C:\\HFSS\\setup_vars.bat"); return 0; } 

अद्यतन 1:

मुझे पता चला कि कुंजी वास्तव में 64-बिट रजिस्ट्री में है, और मैं 32-बिट के रूप में अपने C ++ समाधान का निर्माण कर रहा था एक बार मैंने तय किया कि, यह रजिस्ट्री कुंजी ठीक पाया।

अब मेरे पास पाथ चर में जोड़ने का एक मुद्दा है। एक सिस्टम चर बनाने के बजाय, यह एक उपयोगकर्ता चर PATH बना रहा है और वहां इसे जोड़ रहा है

कमांड लाइन से काम चल रहा है

कोड:

 set KEY_NAME=HKLM\SOFTWARE\Ansoft\Designer\2014.0\Desktop\ set VALUE_NAME=InstallationDirectory FOR /F "usebackq skip=1 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME%`) DO ( set ValueName=%%A set ValueType=%%B set ValueValue=%%C ) if defined ValueName ( @echo Value Value = %ValueValue% ) else ( @echo %KEY_NAME%\%VALUE_NAME% not found. ) :: Set PATH Variable set path_str=%PATH% set addPath=%ValueValue%; echo %addPath% echo %ValueValue% echo %PATH%| find /i "%addPath%">NUL if NOT ERRORLEVEL 1 ( SETX PATH "%PATH% ) else ( SETX PATH "%PATH%;%addPath%;" /M ) 

अद्यतन 2:

मैंने विकल्प / एम के प्लेसमेंट को स्थानांतरित कर दिया और अब यह सही पैथ चर में जोड़ रहा है

हालांकि, जब मैं यह कर रहा हूं, यह एक बार (3 गुना) से अधिक पाथ को जोड़ रहा है और फिर यह दृश्य स्टूडियो एमडी 64 फ़ोल्डर के लिए एक पथ भी जोड़ रहा है।

मुझे यकीन है कि ऐसा क्यों हो रहा है

वेब के समाधान से एकत्रित समाधान "अन्य फ़ोल्डर पथ को सिस्टम पैथ में SEX के साथ भी क्यों जोड़ा गया है और न केवल निर्दिष्ट फ़ोल्डर पथ?"

विंडोज नई प्रक्रिया के लिए एक नई प्रक्रिया शुरू करने की प्रक्रिया की संपूर्ण वातावरण तालिका की प्रतिलिपि बनाता है। इसलिए आपके सी ++ एप्लिकेशन की शुरुआत के दौरान, आपकी एप्लिकेशन को पाथ प्रोसेस, विंडोज एक्सप्लोरर या आपके केस विज़ुअल स्टूडियो से पैटएच सहित वातावरण तालिका मिलती है। और यह पाथ बैच फ़ाइल की शुरुआत पर cmd.exe लिए कॉपी की गई है।

विंडोज़ डेस्कटॉप से ​​बैच फ़ाइल में पूरे प्रोसेस ट्री को लेते हुए, पैथ के लिए कई प्रतिलिपियां बनाई गईं हैं और कुछ प्रक्रियाओं ने पाथ के स्थानीय प्रतिलिपि को कुछ जोड़ा था जैसे विजुअल स्टूडियो ने किया है, या पैट से पथ हटा दिए हैं।

अब आप SETX PATH "%PATH% साथ क्या कर रहे हैं, SETX PATH "%PATH% के स्थानीय प्रतिलिपि को प्रक्रिया पेस्ट में मूल रूप से संशोधित किया गया है जो पूरी तरह से सिस्टम पाथ को डुप्लिकेट पथ की जांच किए बिना।

बेहतर होगा कि सभी कोड को पाथ की स्थानीय प्रति का उपयोग करके फेंक दें और इसके बजाय सिस्टम पाथ का मूल्य पढ़ें, जांचें कि आप जिस पाथ को जोड़ना चाहते हैं, वह पहले से ही सिस्टम पैथ में नहीं है और यदि ऐसा नहीं है, तो जिस पथ को आप चाहते हैं उसे जोड़ें setx का उपयोग करके सिस्टम पाथ को जोड़ने के लिए

और यह सिस्टम पाथ में पर्यावरण चर जैसे %SystemRoot%\System32 को C:\Windows\System32 विस्तार के बिना किया जाना चाहिए।


अद्यतन करें

विंडोज 7 एक्स 64 और विंडोज एक्सपी x 86 पर आपके कार्य के लिए आवश्यक बैच कोड की आवश्यकता है।

 @echo off setlocal EnableExtensions DisableDelayedExpansion set "KeyName=HKLM\SOFTWARE\Ansoft\Designer\2014.0\Desktop" set "ValueName=InstallationDirectory" for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "%KeyName%" /v "%ValueName%" 2^>nul') do ( if /I "%%N" == "%ValueName%" ( set "PathToAdd=%%P" goto GetSystemPath ) ) echo Error: Could not find value "%ValueName%" under key echo %KeyName% echo/ endlocal pause goto :EOF :GetSystemPath for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do ( if /I "%%N" == "Path" ( set "SystemPath=%%P" goto CheckPath ) ) echo Error: System environment variable PATH not found. echo/ endlocal pause goto :EOF :CheckPath setlocal EnableDelayedExpansion set "Separator=" if not "!SystemPath:~-1!" == ";" set "Separator=;" set "PathCheck=!SystemPath!%Separator%" if "!PathCheck:%PathToAdd%;=!" == "!PathCheck!" ( %SystemRoot%\System32\setx.exe Path "!SystemPath!%Separator%%PathToAdd%" /M ) endlocal endlocal 

उपर्युक्त बैच कोड एक सरल केस-असंवेदनशील स्ट्रिंग प्रतिस्थापन और एक केस-सेंसिस्ट स्ट्रिंग तुलना का उपयोग करता है, यह जांचने के लिए कि क्या फ़ोल्डर पथ पहले से मौजूद है, सिस्टम पैथ में मौजूद है। यह केवल तभी काम करता है जब यह ज्ञात है कि फ़ोल्डर पथ पहले कैसे जोड़ा गया था और इस दौरान उपयोगकर्ता ने इस फ़ोल्डर पथ को पाथ में संशोधित नहीं किया है। जाँच करने के लिए एक सुरक्षित विधि के लिए यदि पथ पथ में एक फ़ोल्डर पथ है, तो कैसे देखें कि डायरेक्टरी% PATH% में मौजूद है या नहीं? डेव बेनेम द्वारा लिखित

ध्यान दें: Command SETX डिफ़ॉल्ट रूप से Windows XP पर उपलब्ध नहीं है।

बैच लिपि को पाथ के साथ परीक्षण किया गया जिसमें वर्तमान में एक विस्मयादिबोधक चिह्न के साथ एक फ़ोल्डर पथ होता है और एक फ़ोल्डर पथ के साथ डबल कोट्स में संलग्न होता है जो केवल आवश्यक है कि फ़ोल्डर पथ में अर्धविराम होता है

उपयोग किए गए कमांडों को समझने के लिए और कैसे काम करते हैं, एक कमांड प्रॉम्प्ट विंडो खोलें, वहां निम्न कमांड निष्पादित करें, और प्रत्येक निर्देश के लिए पूरी तरह से सभी सहायता पृष्ठों को बहुत सावधानी से पढ़ें।

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /? और reg query /?
  • set /?
  • setlocal /?
  • setx /?