2017-03-29 5 views
1

呼び出しスクリプトの名前に応じて、私の2.batスクリプトの動作が必要です。呼び出すバットスクリプトの名前を取得する方法

シナリオ: 2.batは他の多くの外部スクリプトから呼び出されますが、これは変更できません。私の親指の下には2.batしかありません。

1.bat

... 
call 2.bat 

2.bat

...here place something extracting "1.bat"... 
+7

可能な重複を検出する(あなたがcontrollすることはできません)あなたはfirst.batを持っていると仮定すると:現在のスクリプトではなく、最初のスクリプトの名前を取得する](http://stackoverflow.com/questions/10087812/batch-bat-get-the-name-of-the-first-script-not-the-current- 1) – geisterfurz007

答えて

3

あなたは、呼び出し元のバットを変更カントとして、それはCMDコンソールを介してトリガされた場合、その名前を取得することはほとんど不可能があるでしょう(かもしれメモリダンプが助けになるかもしれません)、ProcessIdはcmd.exeの情報しか保持しません。あなたが得ることができます

setlocal enableDelayedExpansion 
for /f "tokens=2* delims= " %%a in ("%cmdcmdline%") do (
    if /i "%%~a" equ "/c" (
     for %%# in (%%~b) do (
      echo calling bat : %%~# 
     ) 
    ) else (
     doskey /history >"%tmp%\cmd.history" 
     for /f "usebackq tokens=* delims=" %%# in ("%tmp%\cmd.history") do (
      set "last_command=%%#" 
     ) 
     echo probably this is the calling bat: !last_command! 
     del /q /f "%tmp%\cmd.history" 
    ) 
) 


pause 
0

:呼び出し側のバットは、あなたがこれを使用することができ、ダブルクリックすると

をコマンドプロンプト歴史はあなたにいくつかの情報を与えることができるが、それは信頼できないだろう(と一時ファイルにダンプが必要です)トリックのある呼び出し元のバッチの名前。

それがこの

@echo off 
set caller=empty 
echo This is %~0 

for /L %%n in (1 1 3) do (
    echo(
    echo #1 before calling, n=%%n 
    call second %%n 
) 

echo Back to %~0 

のようになります。そして、あなたのsecond.batは、[バッチ(.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 *** 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" %*" 
    ) 
    echo BACK 
    endlocal 
) 
echo NEVER REACHED 
exit /b 

:mainFunc 
echo :mainFunc of %~nx0 arg1=%1 is called from '%caller%'/%callType% 
exit /b 
関連する問題