2012-04-10 11 views

Odpowiedz

0

nie można zrobić bez skomplikowanej wywołania systemowego do pobierania identyfikatora procesu rodzic lub przechodząc coś jako argumentu lub zmiennej środowiskowej jak w KurzedMetal i Balic posty. Wezwania systemowe są szczegółowo opisane w this post, będziesz musiał importować wywołania DLL do partii, więc nie jest to mała rzecz.

+0

nie używać argumentów, Bali C zrobił. – KurzedMetal

+0

Przepraszam, błędnie przeczytałem twoją odpowiedź! – CharlesB

3

Store wartość %~n0 w zmiennej środowiskowej przed wywołaniem second.bat

3

Myślę, że najłatwiejszym sposobem byłoby przekazanie nazwy pliku pierwszej partii jako parametru do drugiego, w ten sposób.

REM First.bat 
call Second.bat %~n0 

REM Second.bat 
echo %1 

Mam nadzieję, że to pomoże!

2

Ta partia wykrywa nazwę skryptu wywołującego lub nawet jeśli nazywa się bezpośrednio z linii poleceń

@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 

Wykorzystuje fakt, że (goto) oświadczenie usunie jeden poziom ze stosu.
Powoduje to pozostawienie bieżącego pliku wsadowego, a %~f0 będzie nazwą skryptu wywołującego (i %~0 bieżącą funkcją tej partii) lub tekstem w przypadku wywołania z wiersza poleceń.

Wtedy własny skrypt jest wywoływany dzięki "%~d0\:mainFunc\..%~pnx0"

Script Zewnętrzna

ułatwia obsługę można dodać plik wsadowy pomocnika.
Użyj go we własnych skryptach z tej linii

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

Nazwa pliku wsadowego pomocnik 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

upraszczając to do 2 lub 3 linii do osadzenia w innym skrypcie ... obiektywnie po prostu wykryj nazwę skryptu wywołującego .... czy możesz podać przykład tylko soku (nazwa uchwytu skryptu wywołującego) ... – ZEE

+0

@ZEE Nie jest to możliwe z 2 lub 3 liniami, ponieważ musisz wyjść z bieżącej partii, aby pobrać nazwę skryptu wywołującego, a następnie musisz ponownie uruchomić bieżący skrypt, ale unikając nieskończonej pętli. Ale możliwe byłoby przeniesienie całego kodu do pliku wsadowego pomocnika. – jeb

+0

@ZEE Dodano skrypt pomocniczy – jeb

Powiązane problemy