2012-04-10 8 views

Antwort

0

Sie können es nicht für die Beschaffung von übergeordnetem Prozess-ID oder gibt etwas als Argument oder Umgebungsvariablen wie in KurzedMetal und Balic ohne komplizierten Systemaufruf tun Beiträge. Die involvierten Systemaufrufe sind detailliert in this post, Sie müssen DLL-Aufrufe in Stapel importieren, also ist es keine Kleinigkeit.

+0

ich keine Argumente verwendet haben, hat Bali C. – KurzedMetal

+0

Entschuldigung, falsch gelesene Antwort! – CharlesB

3

Shop der Wert %~n0 in einer Umgebungsvariable vor dem Aufruf second.bat

3

Ich denke, der einfachste Weg, dies zu tun wäre, den Dateinamen der ersten Charge als Parameter an die zweite übergeben, so.

REM First.bat 
call Second.bat %~n0 

REM Second.bat 
echo %1 

Hoffe, das hilft!

2

Dieser Ansatz erkennt den Namen des Anrufers Skript oder auch wenn es direkt von der Kommandozeile

@echo off 
setlocal DisableDelayedExpansion 
set "func=%~0" 
for /F "delims=\" %%X in ("%func:*\=%") do set "func=%%X" 
if ":" == "%func:~0,1%" (
    goto %func% 
) 
REM *** Get the name of the caller 
(
    (goto) 2>nul 
    setlocal DisableDelayedExpansion 
    call set "caller=%%~f0" 
    call set _caller=%%caller:*%%~f0=%% 
    if defined _caller (
     set "callType=batch" 
     call "%~d0\:mainFunc\..%~pnx0" %* 
    ) ELSE (
     set "callType=cmd-line" 
     cmd /c "call "%~d0\:mainFunc\..%~pnx0" %*" 
    ) 
    endlocal 
) 
echo NEVER REACHED 
exit /b 

:mainFunc 
echo :mainFunc of %~nx0 arg1=%1 is called from '%caller%'/%callType% 
exit /b 

Es nutzt die Tatsache genannt, dass eine (goto) Aussage einer Ebene aus dem Stapel entfernt werden.
Dies führt zum Verlassen der aktuellen Batch-Datei und %~f0 wird der Name des Aufrufers Skript (und %~0 die aktuelle Funktion dieser Charge) oder der Text %~f0 im Fall von von der Befehlszeile aufgerufen werden.

Dann wird das eigene Skript erneut aufgerufen mit "%~d0\:mainFunc\..%~pnx0"

Externe Script

Zur einfachen Verwendung Sie einen Helfer Batch-Datei hinzufügen könnte.
es in Ihren eigenen Skripten mit dieser Linie Verwenden

@echo off 
<:GetCaller <nul call GetCaller.bat myCallerVar 
echo This batch was called from "%myCallerVar%" 

Namen der Helfer Batch-Datei GetCaller.bat

@echo off 
setlocal DisableDelayedExpansion 
set "func=%~0" 
for /F "delims=\" %%X in ("%func:*\=%") do set "func=%%X" 
if ":" == "%func:~0,1%" (
    goto %func% 
) 

REM *** STEP1 
REM *** Get the filename of the caller of this script, needed for later restart that 
(
    (goto) 2>nul 
    setlocal DisableDelayedExpansion %= it could be reenabled by the GOTO =% 
    set "_returnVar=%~1" 
    call set "_lastCaller=%%~f0" 
    call set "_argToLastCaller=%%*" 
    call "%~d0\:Step2\..%~pnx0" %* 
) 
exit /b %= This is never reached =% 

:Step2 
REM *** STEP2 
REM *** Get the filename/cmd-line of the caller of the script 
(
    (goto) 2>nul 
    (goto) 2>nul 
    setlocal DisableDelayedExpansion %= it could be reenabled by the GOTO =%  
    set "_returnVar=%_returnVar%" 
    set "_lastCaller=%_lastCaller%" 
    set "_argToLastCaller=%_argToLastCaller%" 
    call set "caller=%%~f0" 
    call set _caller=%%caller:*%%~f0=%% 
    if defined _caller (
     set "callType=batch" 
     call "%~d0\:Step3batch\..%~pnx0" 
    ) ELSE (
     set "callType=cmd-line" 
     cmd /c "call "%~d0\:Step3batch\..%~pnx0" " 
    ) 
    endlocal 
) 
exit /b %= This is never reached =% 

:Step3batch 
REM *** STEP3 Restart the requester batch, but jump to the label :GetCaller 
call :GetCaller 
exit /b %= This is never reached =% 

:GetCaller 
REM *** This uses the trick, that starting a batch without CALL will jump to the last used label 
if "%_returnVar%" NEQ "" set "%_returnVar%=%_caller%" 
%_lastCaller% %_argToLastCaller% 

echo #6 never reached 
+0

Vereinfachung, dass nur 2 oder 3 Zeilen in andere Skript eingebettet werden ... objektive nur aufrufende Skript-Namen zu erkennen .... können Sie ein Beispiel geben os nur den Saft (Name des Anrufers Skript zu greifen) ... – ZEE

+0

@ZEE Dies ist nicht mit 2 oder 3 Zeilen möglich, da Sie den aktuellen Stapel beenden müssen, um den Namen des Anruferscripts abzurufen. Anschließend müssen Sie das aktuelle Skript neu starten, jedoch eine Endlosschleife vermeiden. Es wäre jedoch möglich, den vollständigen Code in eine Hilfsbatchdatei zu verschieben. – jeb

+0

@ZEE Ein Hilfsskript wurde hinzugefügt – jeb

Verwandte Themen