मैं इनवॉकर (बाहरी) बैच फ़ाइल की कार्यशील निर्देशिका, इनवॉक्ड (नेस्टेड / इनर) बैच फ़ाइल के लिए कैसे रख सकता हूं?


0

मुझे समझाने का क्या मतलब है।

मैं cmd.exe कंसोल के अंदर cmder.exe ( थ्रूinit.bat ) चलाता हूं । संलग्न GIF देखें। इस उद्देश्य के लिए मैंने cmr.batनीचे दिखाया गया एक छोटा बैच स्क्रिप्ट लिखा । यह काम करता है जैसा कि इसका मतलब था।

@echo off
%comspec% /k "C:\cmder\vendor\init.bat %*"
EXIT /B %ERRORLEVEL%

यहां छवि विवरण दर्ज करें

लेकिन, यह दृष्टिकोण सीधे उन्नत मोडinit.bat में चलाने की क्षमता प्रदान नहीं करता है ।

दिए गए समाधान से प्रेरित होने के कारण , मैंने एक और बैच फ़ाइल बनाई, amr.batताकि आंतरिक init.batको उन्नत मोड में चलाया जा सके ।

यहाँ की सामग्री है amr.bat

:: Automatically check & get admin rights V2
@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"="
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"

::::::::::::::::::::::::::::::
:: START OF USER CUSTOM CODE
::::::::::::::::::::::::::::::

%comspec% /k "C:\cmder\vendor\init.bat %*" rem THIS IS MY CODE
EXIT /B %ERRORLEVEL%

amr.batचलती है init.batमें ऊंचा मोड , लेकिन नहीं रखता (बनाए रखने) कार्यशील निर्देशिका जिसमें से यह कहा जाता रहा है । नीचे दिए गए जीआईएफ स्क्रैंकास्ट इस व्यवहार को प्रदर्शित करते हैं।

यहां छवि विवरण दर्ज करें

init.bat कार्यशील निर्देशिका जिसमें से यह लागू किया गया था प्राप्त नहीं किया था । इसके बजाय init.batके साथ शुरू किया गया था कार्यशील निर्देशिका के स्थान के लिए सेटamr.bat (जो में रहता C:\BatScriptsनिर्देशिका)।


तो मेरे सवाल है, मैं कैसे संशोधित कर सकते हैंamr.bat स्क्रिप्ट, आदेश रखने के लिए (बनाए रखने) वर्तमान निर्देशिका जिसमें से यह लागू किया गया था में ?

कोई विचार?

जवाबों:


0

यह समाधान मेरे लिए स्पष्ट नहीं था, हालाँकि यह जितना मैंने किया था उससे कहीं अधिक सरल था।

इस संकेत द्वारा संचालित होने के नाते , मुझे एहसास हुआ है कि वर्तमान संदर्भ (इनवॉकर बैच फ़ाइल की कार्यशील निर्देशिका) को VBScript फ़ाइल में कैप्चर और पास करना होगा।

मैंने अपनी amr.batस्क्रिप्ट को निम्नलिखित तरीके से संशोधित किया है ।

@echo off

:: Let me capture the current working directory
set InvokerCapturedWorkingDirectory=%cd%

:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"="
    echo UAC.ShellExecute "%comspec%", "/k C:\cmder\vendor\init.bat %params% & cd /d %InvokerCapturedWorkingDirectory%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"

:::::::::::::::::::::::::::::::
:: START OF USER CUSTOM CODE ::
:::::::::::::::::::::::::::::::

:: IS NOT NEEDED ANYMORE
::%comspec% /k "C:\cmder\vendor\init.bat %*"
EXIT /B %ERRORLEVEL%

मुझे अपने शब्दों की पुष्टि करने दें :

यहां छवि विवरण दर्ज करें


यदि आप उत्पन्न VBScript फ़ाइल ( जो एलिवेटेड मोड में बैच फ़ाइल चलाता है ) की सामग्री के बारे में उत्सुक हैं , तो आप यहाँ हैं:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.