私はfirst.bat
とsecond.bat
を持っています。 echo %~n0
(実行中のバッチの表示名)バッチ(.bat):現在のスクリプトではなく、最初のスクリプトの名前を取得します
出力がSecond.bat
ですが、私はありません、それは自分だ、それは呼び出し元のファイル名を表示したい:call second.bat
第二には、次のとおりです。
first.batです。
これは可能ですか?
私はfirst.bat
とsecond.bat
を持っています。 echo %~n0
(実行中のバッチの表示名)バッチ(.bat):現在のスクリプトではなく、最初のスクリプトの名前を取得します
出力がSecond.bat
ですが、私はありません、それは自分だ、それは呼び出し元のファイル名を表示したい:call second.bat
第二には、次のとおりです。
first.batです。
これは可能ですか?
投稿。関係するシステムコールはthis postで詳述されているので、DLLコールをバッチにインポートする必要があります。
ストア呼び出す前に、環境変数に%~n0
の値second.bat
これを行う最も簡単な方法は、最初のバッチのファイル名を2番目のパラメータにパラメータとして渡すことです。
REM First.bat
call Second.bat %~n0
REM Second.bat
echo %1
このバッチは、呼び出し元スクリプトの名前を検出したり、それは(goto)
文がスタックから1つのレベルを削除することを、事実を使用しています
@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
コマンドラインから直接呼ばれていたとしても。
この結果、現在のバッチファイルが残ってしまい、%~f0
は呼び出し元スクリプトの名前(およびそのバッチの現在の機能である%~0
)またはコマンドラインから呼び出された場合は%~f0
のテキストになります。
その後、独自のスクリプトでは、ヘルパーバッチファイルを追加することができます簡単に使用するために"%~d0\:mainFunc\..%~pnx0"
外部スクリプト
で再び呼び出されます。
このライン
@echo off
<:GetCaller <nul call GetCaller.bat myCallerVar
echo This batch was called from "%myCallerVar%"
名前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
私は、引数を使用していないが、バリCがやったヘルパーバッチファイルを使用して独自のスクリプトで使用してください。 – KurzedMetal
申し訳ありませんが、あなたの答えを誤解しました! – CharlesB