Como posso manter o diretório de trabalho do arquivo em lotes invoker (externo), para o arquivo em lote invocado (aninhado / interno)?

0

Deixe-me explicar o que eu quis dizer.

Eu corro cmder.exe (via init.bat ) dentro de uma janela do console cmd.exe. Veja o GIF anexado. Para este propósito eu escrevi um pequeno lote de script cmr.bat mostrado abaixo. Funciona como deveria.

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

Masessaabordagemnãoofereceacapacidadedeexecutaroinit.batnomodoelevadodiretamente.

Inspirando-mena solução dada , criei outro arquivo de lote amr.bat para executar o% co_de interno % no modo elevado .

Aqui está o conteúdo do init.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%

O amr.bat executa o amr.bat no modo elevado , mas não mantém (retém) o diretório de trabalho do qual foi chamado . O screencast abaixo GIF demonstra esse comportamento.

O init.bat não recebeu o diretório de trabalho do qual foi invocado . Em vez disso, init.bat foi iniciado com o diretório de trabalho definido para o local do init.bat (que reside no diretório amr.bat ).

Então, minha pergunta é, como posso modificar o script C:\BatScripts , para manter (reter) o diretório atual do qual ele foi invocado ?

Alguma idéia?

    
por AndreyWD 10.11.2017 / 19:33

1 resposta

0

A solução não era óbvia para mim, mas era muito mais simples do que eu esperava.

Sendo impulsionado por esta dica , percebi que o contexto atual (trabalhando diretório do arquivo em lote do invoker) teve que ser capturado e passado para o arquivo VBScript.

Eu modifiquei meu script amr.bat da seguinte maneira.

   
@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%

Deixe-me confirmar minhas palavras:

SevocêestivercuriososobreoconteúdodoarquivogeradodoVBScript(queexecutaoarquivoemlotenomodoelevado),aquiestá:

    
por 10.11.2017 / 21:37