Позвольте мне объяснить, что я имел в виду.

Я запускаю cmder.exe (через init.bat) в окне консоли cmd.exe. Смотрите прикрепленный 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 в режиме с повышенными правами , но не сохраняет (сохраняет) рабочий каталог, из которого он был вызван. Приведенный ниже скриншот GIF демонстрирует это поведение.

init.bat не получил рабочий каталог, из которого он был вызван. Вместо этого init.bat был запущен с рабочим каталогом, установленным по amr.bat (который находится в каталоге C:\BatScripts ).


Итак, мой вопрос, как я могу изменить скрипт amr.bat , чтобы сохранить (сохранить) текущий каталог, из которого он был вызван?

Есть идеи?

1 ответ1

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 (который запускает пакетный файл в режиме повышенных прав), то вот вам:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .