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



batch-file registry (1)

विंडोज नई प्रक्रिया के लिए एक नई प्रक्रिया शुरू करने की प्रक्रिया की संपूर्ण वातावरण तालिका की प्रतिलिपि बनाता है। इसलिए आपके सी ++ एप्लिकेशन की शुरुआत के दौरान, आपकी एप्लिकेशन को पाथ प्रोसेस, विंडोज एक्सप्लोरर या आपके केस विज़ुअल स्टूडियो से पैटएच सहित वातावरण तालिका मिलती है। और यह पाथ बैच फ़ाइल की शुरुआत पर 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 /?

मेरे पास एक बैच फ़ाइल है जो मैं 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 फ़ोल्डर के लिए एक पथ भी जोड़ रहा है।

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





registry