Как сохранить рабочий каталог пакетного файла invoker (внешний) для вызванного (вложенного / внутреннего) пакетного файла?

372
AndreyWD

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

Я запускаю cmder.exe (через init.bat) в окне консоли cmd.exe. Смотрите прикрепленный GIF. Для этого я написал небольшой пакетный скрипт, cmr.batпоказанный ниже. Он работает так, как и хотел.

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

enter image description here

Но этот подход не дает возможности напрямую запускать 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 демонстрирует это поведение.

enter image description here

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


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

Есть идеи?

0

1 ответ на вопрос

0
AndreyWD

Решение не было очевидным для меня, однако оно оказалось намного проще, чем я ожидал.

Будучи движимый этим намеком, я понял, что текущий контекст (рабочий каталог Вызывающий пакетного файла) должны были быть захвачены и передаются в файл 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% 

Позвольте мне подтвердить мои слова:

enter image description here


Если Вам интересно, о содержании в генерируемой VBScript файла ( который запускает пакетный файл в режиме повышенной ), здесь вы:

enter image description here

Похожие вопросы