Wie kann ich das Arbeitsverzeichnis der aufrufenden (äußeren) Stapeldatei für die aufgerufene (verschachtelte / innere) Stapeldatei beibehalten?

443
AndreyWD

Lassen Sie mich erklären, was ich gemeint habe.

Ich führe cmder.exe (via init.bat) in einem cmd.exe-Konsolenfenster aus. Siehe die beigefügte GIF. Zu diesem Zweck habe ich ein kleines Batch-Skript geschrieben cmr.bat. Es funktioniert so, wie es gedacht hat.

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

enter image description here

Dieser Ansatz bietet jedoch nicht die Möglichkeit, den Modusinit.bat im erhöhten Modus direkt auszuführen .

Als Inspiration für die gegebene Lösung erstellte ich eine weitere Batchdatei amr.bat, um die innere init.batim erhöhten Modus auszuführen .

Hier ist der Inhalt der 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% 

Das amr.batführt das init.batim erhöhten Modus aus, behält jedoch nicht das Arbeitsverzeichnis bei, von dem es aufgerufen wurde . Der folgende GIF-Screencast veranschaulicht dieses Verhalten.

enter image description here

Das init.bat Arbeitsverzeichnis, von dem es aufgerufen wurde, wurde nicht empfangen . Statt init.batmit dem begonnenen Arbeitsverzeichnis an die Stelle des Satz der amr.bat(die in residiert C:\BatScriptsVerzeichnis).


Meine Frage lautet also: Wie kann ich das amr.batSkript ändern, um das aktuelle Verzeichnis, in dem es aufgerufen wurde, beizubehalten (beizubehalten) ?

Irgendwelche Ideen?

0

1 Antwort auf die Frage

0
AndreyWD

Die Lösung war für mich nicht offensichtlich, jedoch viel einfacher als ich erwartet hatte.

Aufgrund dieses Hinweises habe ich erkannt, dass der aktuelle Kontext (Arbeitsverzeichnis der Invoker-Batchdatei) erfasst und an die VBScript-Datei übergeben werden musste.

Ich habe mein amr.batSkript auf folgende Weise geändert .

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

Lassen Sie mich meine Worte bestätigen :

enter image description here


Wenn Sie neugierig auf den Inhalt der generierten VBScript-Datei sind ( die die Batchdatei im erhöhten Modus ausführt ), sind Sie hier:

enter image description here