這個問題在這里已經有了答案: 如何在當前批處理中呼叫另一個批處理檔案中定義的函式? (4 個回答) 10 小時前關閉。
我有一個批處理檔案,它是一個函式庫,例如
:findmsbuild
if exist msbuildpath.txt (
for /f %%i in (msbuildpath.txt) do set MSBUILD="%%i\MSBuild.exe"
) else (
set VSWHERE="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
for /f "delims=" %%i in ('!VSWHERE! -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe') do set MSBUILD="%%i"
)
exit /b
官方檔案call說我應該可以直接呼叫另一個檔案中的標簽,例如
call library.bat :findmsbuild
但實際上發生的是,解釋器從第一行執行 library.bat。我究竟做錯了什么?呼叫批處理檔案大約是
setlocal enableextensions enabledelayedexpansion
cd "%~dp0"
call library.bat :findmsbuild
echo %MSBUILD%
uj5u.com熱心網友回復:
你在做什么錯?信任微軟的檔案。
您可以呼叫 externalbatch 或呼叫 :internalroutine。
要執行您想要的操作,您需要在庫檔案的開頭放置一行 goto %1 - 然后記住引數串列在開頭有標簽,因此您需要移動它,并且%* 將保留標簽作為第一個引數。
uj5u.com熱心網友回復:
前言:作業/功能在下面互換使用。
可以以這種方式呼叫函式,但是您需要將其撰寫到 library.bat 程式中。這意味著評估提供的引數,確定它們是否對應于有效的作業,并確定要采取的行動,例如呼叫帶%*引數的作業或提供幫助輸出。
注意:Call %*用于執行%1呼叫 library.bat 時提供的標簽將:
- 理想的行為:
- 允許提供給被呼叫作業的引數在被呼叫時駐留在它們的預期
:jobname位置%0。
- 允許提供給被呼叫作業的引數在被呼叫時駐留在它們的預期
- 潛在不良行為:
- 導致引數中出現的任何插入符號加倍。如果與任何作業相關,您需要在相關作業中說明這一點。
- 展開
%variables%提供給 library.bat 的引數字串中的任何存在(已定義或未定義)
執行所需功能的示例:
@Echo off
Echo(
Set "ExitCode=0"
2> nul (
Rem // search this file for labels matching Argument 1 at line beginning.
%SystemRoot%\System32\Findstr.exe /BLI "%~1" "%~f0" > nul && (
Call %* || (
Call Set "ExitCode=%%Errorlevel%%"
(Call )
)
) || (
Echo("%~1"|%SystemRoot%\System32\Findstr.exe /R "[:][.]*" && (
Rem // No labels matching Argument 1 at line beginning. Argument 1 begins with a ":"
Echo(Invalid job. Valid jobs:
For /f "tokens=1" %%J in ('%SystemRoot%\System32\Findstr.exe /R "^[:][.]*" "%~f0"')Do Echo(%%J
Exit /b 1
) || If not "%~1" == "" (
Rem // Argument 1 does not begin with a ":"
Echo(No job call attempt. Args: %*
Echo(
Echo(To call a job:
Echo(Call "%~f0" :jobname %%*
)
)
)
Exit /b %ExitCode%
:demo
Echo(Jobname %0 JobArgs: [%*]
Exit /b 0
:job
Echo(Jobname %0 JobArgs: [%*]
REM // demostrate return of errorlevel in ExitCode variable facilitate && || logic
set /A ExitCode=%random% %% 2
Exit /b %ExitCode%
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/495020.html
