batch file包含variables的外部文件
我有一个batch file,我想包括包含一些variables(比如configurationvariables)的外部文件。 可能吗?
注:我假设Windowsbatch file,因为大多数人似乎没有意识到有显着的差异,只是盲目地调用黑色背景DOS上的灰色文本的一切。 不过,第一个变体也应该在DOS下工作。
可执行configuration
最简单的方法是将variables放在一个batch file中,每个都有自己的set
语句:
set var1=value1 set var2=value2 ...
并在你的主要批次:
call config.cmd
当然,这也可以使variables有条件地创build,也可以根据系统的不同而有所不同,所以它是非常通用的。 但是,任意代码可以在那里运行,如果有语法错误,那么你的主批也会退出。 在UNIX世界中,这似乎相当普遍,特别是对于shell。 如果你考虑一下, autoexec.bat
是没有别的。
键/值对
另一种方式是configuration文件中的某种var=value
对:
var1=value1 var2=value2 ...
然后你可以使用下面的代码来加载它们:
for /f "delims=" %%x in (config.txt) do (set "%%x")
这和以前一样使用类似的技巧,就是在每一行上使用set
。 引号是为了避免像<
, >
, &
, |
。 但是,当input中使用引号时,它们本身会中断。 在进一步处理用这些字符存储的variables中的数据时,你总是需要小心。
一般来说,自动转义任意input,以避免在batch file中的头痛或问题,这似乎是不可能的。 至less我还没有find办法。 当然,第一个解决scheme是将这个责任推给编写configuration文件的人。
如果外部configuration文件也是有效的batch file,则可以使用:
call externalconfig.bat
在脚本里面 尝试创build以下a.bat:
@echo off call b.bat echo %MYVAR%
和b.bat:
set MYVAR=test
运行a.bat应该会生成输出:
test
批量使用小于和大于括号作为input和输出pipe道。
>file.ext
只使用上面的一个输出括号将覆盖该文件中的所有信息。
>>file.ext
使用双右括号将下一行添加到文件。
( echo echo )<file.ext
这将根据文件的行执行参数。 在这种情况下,我们使用两行将使用“回声”键入的行。 左括号接触右括号表示来自该文件的信息将被传送到这些行中。
我已经编译了一个例子只读/写文件。 以下是将这些文件分成几部分来解释每个部分的function。
@echo off echo TEST R/W set SRU=0
在这个例子中SRU可以是任何东西。 如果您按Enter键太快,我们实际上将其设置为防止崩溃。
set /p SRU=Skip Save? (y): if %SRU%==y goto read set input=1 set input2=2 set /p input=INPUT: set /p input2=INPUT2:
现在,我们需要将variables写入文件。
(echo %input%)> settings.cdb (echo %input2%)>> settings.cdb pause
我使用.cdb作为“命令数据库”的简短格式。 您可以使用任何扩展名。 下一节将从头开始testing代码。 我们不想使用在文件开始处运行的设置variables,我们实际上希望它们从我们刚刚写的settings.cdb中加载。
:read ( set /p input= set /p input2= )<settings.cdb
所以,我们只是把你在文件开头写的前两行信息(你可以跳过设置行来检查以确保它正在工作)来设置input和input2的variables。
echo %input% echo %input2% pause if %input%==1 goto newecho pause exit :newecho echo If you can see this, good job! pause exit
这将显示settings.cdb被传送到括号中时设置的信息。 作为一个额外的好工作动力,按回车并设置我们之前设置为“1”的默认值将返回一个好的工作信息。 使用支架pipe道是双向的,比设置“FOR”的东西容易得多。 🙂
所以你只需要做对吧?
@echo off echo text shizzle echo. echo pause^>nul (press enter) pause>nul REM writing to file ( echo XD echo LOL )>settings.cdb cls REM setting the variables out of the file ( set /p input= set /p input2= )<settings.cdb cls REM echo'ing the variables echo variables: echo %input% echo %input2% pause>nul if %input%==XD goto newecho DEL settings.cdb exit :newecho cls echo If you can see this, good job! DEL settings.cdb pause>nul exit
我们不要忘记旧的参数。 启动* .bat或* .cmd文件时,最多可以在命令文件名后面添加9个参数:
call myscript.bat \\path\to\my\file.ext type call myscript.bat \\path\to\my\file.ext "Del /F"
示例脚本
myscript.bat可能是这样的:
@Echo Off Echo The path of this scriptfile %~0 Echo The name of this scriptfile %~n0 Echo The extension of this scriptfile %~x0 Echo. If "%~2"=="" ( Echo Parameter missing, quitting. GoTo :EOF ) If Not Exist "%~1" ( Echo File does not exist, quitting. GoTo :EOF ) Echo Going to %~2 this file: %~1 %~2 "%~1" If %errorlevel% NEQ 0 ( Echo Failed to %~2 the %~1. ) @Echo On
输出示例
c:\>c:\bats\myscript.bat \\server\path\x.txt type The path of this scriptfile c:\bats\myscript.bat The name of this scriptfile myscript The extension of this scriptfile .bat Going to type this file: \\server\path\x.txt This is the content of the file: Some alphabets: ABCDEFG abcdefg Some numbers: 1234567890 c:\>c:\bats\myscript.bat \\server\path\x.txt "del /f " The path of this scriptfile c:\bats\myscript.bat The name of this scriptfile myscript The extension of this scriptfile .bat Going to del /f this file: \\server\path\x.txt c:\>
:: savevars.bat :: Use $ to prefix any important variable to save it for future runs. @ECHO OFF SETLOCAL REM Load variables IF EXIST config.txt FOR /F "delims=" %%A IN (config.txt) DO SET "%%A" REM Change variables IF NOT DEFINED $RunCount ( SET $RunCount=1 ) ELSE SET /A $RunCount+=1 REM Display variables SET $ REM Save variables SET $>config.txt ENDLOCAL PAUSE EXIT /B
输出:
$ RunCount = 1
$ RunCount = 2
$ RunCount = 3
上面概述的技术也可以用来在多个batch file之间共享variables。
资料来源: http : //www.incodesystems.com/products/batchfi1.htm