在DOS .bat / .cmd脚本中有
a nice way to build functions.要模块化一些安装脚本,将包含函数库的文件包含到.bat / .cmd脚本中是非常好的.
我试过的是:
mainscript.bat
call library.bat call:function1
library.bat
goto:eof :stopCalipri -- stop alle prozesse die mit calipri zu tun haben :: -- %~1: argument description here SETLOCAL REM.--function body here set LocalVar1=dummy set LocalVar2=dummy echo "Called function successfully :)" (ENDLOCAL & REM -- RETURN VALUES IF "%~1" NEQ "" SET %~1=%LocalVar1% IF "%~2" NEQ "" SET %~2=%LocalVar2% ) GOTO:EOF
当我调用mainscript.bat时,我得到以下输出:
Das Sprungziel – function1 wurde nicht gefunden.
什么意思或多或少:找不到名为function1的跳转点
任何想法,还是这不可能?
这是可能的,有一些不同的方法来做到这一点.
1)将完整的“库”复制并粘贴到每个文件中
作品,但它并不是一个图书馆,更改/更正所有文件中的库函数是一个恐怖
2)通过调用包装器包含一个库
call batchLib.bat :length result "abcdef"
并以batchLib.bat开头
call %* exit /b ... :length ...
易于编程,但非常慢,因为每个库调用都加载库批次,并且可能出现的参数问题.
3)“自载”图书馆BatchLibrary or how to include batch files
它每次创建临时批处理文件,结合自己的代码和库代码.
它在库启动时执行一些高级功能,如安全参数访问.
但在我看来,它也很容易使用
用户脚本示例
@echo off REM 1. Prepare the BatchLibrary for the start command call BatchLib.bat REM 2. Start of the Batchlib,acquisition of the command line parameters,activates the code with the base-library <:%BL.Start% rem Importing more libraries ... call :bl.import "bl_DateTime.bat" call :bl.import "bl_String.bat" rem Use library functions call :bl.String.Length result abcdefghij echo len=%result%
编辑:另一种方式是…
4)宏库
你可以使用批处理宏,很容易包含和使用它们.
call MacroLib.bat set myString=abcdef %$strLen% result,myString echo The length of myString is %result%
但是构建宏非常棘手!
更多关于Batch “macros” with arguments的宏观技术
MacroLibrary.bat
set LF=^ ::Above 2 blank lines are required - do not remove set ^"\n=^^^%LF%%LF%^%LF%%LF%^^" :::: StrLen pString pResult set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n% for /F "tokens=1,2 delims=," %%1 in ("!argv!") do (%\n% set "str=A!%%~2!"%\n% set "len=0"%\n% for /l %%A in (12,-1,0) do (%\n% set /a "len|=1<<%%A"%\n% for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n% )%\n% for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n% ) %\n% ) ELSE setlocal enableDelayedExpansion ^& set argv=,