2012-04-10 18 views

Respuesta

0

No puede hacerlo sin llamada al sistema complicado para recuperar el ID del proceso padre, o que pasa algo como una variable argumento o el medio ambiente como en KurzedMetal y Balic publicaciones. Las llamadas al sistema en cuestión se detalla en this post, tendrá que importar DLL pone en lotes, por lo que no es una cosa pequeña.

+0

no hice uso de argumentos, Bali C hizo. – KurzedMetal

+0

lo siento, leí tu respuesta! – CharlesB

3

tienda el valor de %~n0 en una variable de entorno antes de llamar second.bat

3

creo que la forma más fácil de hacer esto sería pasar el nombre de archivo del primer lote como un parámetro para el segundo, como este.

REM First.bat 
call Second.bat %~n0 

REM Second.bat 
echo %1 

Hope this helps!

2

Este lote detecta el nombre del script que llama o incluso si se llama directamente desde la línea de comandos

@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 

Utiliza el hecho de que una declaración (goto) eliminará un nivel de la pila.
Esto da como resultado que deje el archivo de proceso por lotes actual y %~f0 será el nombre del script de llamada (y %~0 la función actual de ese lote) o el texto %~f0 en el caso de que se llame desde la línea de comando.

A continuación, el propio guión se llama de nuevo con "%~d0\:mainFunc\..%~pnx0"

script externo

Para un uso fácil se podría añadir un archivo por lotes ayudante.
utilizarlo en sus propias secuencias de comandos con esta línea

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

Nombre del archivo por lotes ayudante 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

simplificadora de que a sólo 2 o 3 líneas para incrustar en otro script ... solo objetivo detectar llamando a nombre del script .... Puede dar un ejemplo os acaba el jugo (nombre de sorpresas de la secuencia de comandos que llama) ... – ZEE

+0

@ZEE no es posible con 2 o 3 líneas, ya que tiene que salir del lote actual a buscar el nombre del script que llama y luego se tenga que reiniciar el script actual, pero evitando un bucle sin fin. Pero sería posible mover el código completo a un archivo de ayuda por lotes. – jeb

+0

@ZEE añadido un script de ayuda – jeb

Cuestiones relacionadas