Answers:
注意:我假设Windows批处理文件是因为大多数人似乎不知道它们之间存在重大差异,因此只能在黑色背景DOS上用灰色文本盲目调用所有内容。但是,第一种变体也应在DOS中工作。
最简单的方法是将变量本身放在批处理文件中,每个变量都有自己的set
语句:
set var1=value1
set var2=value2
...
在您的主要批次中:
call config.cmd
当然,这还使得可以有条件地或根据系统的各个方面来创建变量,因此它非常灵活。但是,可以在此处运行任意代码,并且如果存在语法错误,那么您的主批处理也将退出。在UNIX世界中,这似乎相当普遍,尤其是对于Shell。如果您考虑一下,autoexec.bat
别无其他。
另一种方法是var=value
在配置文件中进行某种配对:
var1=value1
var2=value2
...
然后,您可以使用以下代码片段加载它们:
for /f "delims=" %%x in (config.txt) do (set "%%x")
这利用了与以前类似的技巧,即仅set
在每行上使用。该报价是有逃避之类的东西<
,>
,&
,|
。但是,当输入中使用引号时,它们本身将中断。另外,在进一步处理以此类字符存储的变量中的数据时,您始终需要小心。
通常,对我来说,自动转义任意输入以使批处理文件不会引起麻烦或问题似乎是不可能的。至少我还没有找到一种方法。当然,使用第一个解决方案,您会将这种责任推给编写配置文件的责任。
如果外部配置文件也是有效的批处理文件,则可以使用:
call externalconfig.bat
在您的脚本中。尝试创建以下a.bat:
@echo off
call b.bat
echo %MYVAR%
和b.bat:
set MYVAR=test
运行a.bat应该生成输出:
test
call
,即btw同步调用),则会显示“该进程由于正在使用该文件而无法访问该文件”,因此无法调用。
批处理使用小于和大于括号作为输入和输出管道。
>file.ext
仅使用如上所述的一个输出括号将覆盖该文件中的所有信息。
>>file.ext
使用右双括号将下一行添加到文件中。
(
echo
echo
)<file.ext
这将基于文件的行执行参数。在这种情况下,我们使用将使用“ echo”键入的两行。左括号接触右括号,意味着该文件中的信息将通过管道传送到这些行中。
我已经编译了一个仅用于示例的读/写文件。下面是该文件,分为几个部分来解释每个部分的作用。
@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:
现在,我们需要将变量写入文件。
(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause
我使用.cdb作为“命令数据库”的缩写。您可以使用任何扩展名。下一节将从头测试代码。我们不想使用在文件开头运行的设置变量,实际上是希望它们从我们刚刚编写的settings.cdb中加载。
:read
(
set /p input=
set /p input2=
)<settings.cdb
因此,我们仅通过管道传输了您在文件开头写入的前两行信息(您可以选择跳过设置这些行以检查其是否有效)的选项,以设置input和input2的变量。
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插入括号中时设置的信息。作为一项出色的工作动机,按Enter键并设置我们先前设置为“ 1”的默认值将返回一条好工作信息。使用支架管是双向的,比设置“ 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
:: 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
上面概述的技术还可以用于在多个批处理文件之间共享变量。
有点老的话题,但几天前我有一个相同的问题,我想出了另一个主意(也许有人会觉得有用)
例如,您可以使用不同的主题(家庭,大小,颜色,动物)制作config.bat,并在批处理脚本中以所需的任何顺序分别应用它们:
@echo off
rem Empty the variable to be ready for label config_all
set config_all_selected=
rem Go to the label with the parameter you selected
goto :config_%1
REM This next line is just to go to end of file
REM in case that the parameter %1 is not set
goto :end
REM next label is to jump here and get all variables to be set
:config_all
set config_all_selected=1
:config_family
set mother=Mary
set father=John
set sister=Anna
rem This next line is to skip going to end if config_all label was selected as parameter
if not "%config_all_selected%"=="1" goto :end
:config_test
set "test_parameter_all=2nd set: The 'all' parameter WAS used before this echo"
if not "%config_all_selected%"=="1" goto :end
:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end
:config_color
set first_color=blue
set second_color=green
if not "%config_all_selected%"=="1" goto :end
:config_animals
set dog=Max
set cat=Miau
if not "%config_all_selected%"=="1" goto :end
:end
之后,您可以在任何地方使用它,方法是使用'call config.bat all'完全调用或仅调用其中的一部分(请参见下面的示例),这里的想法是,当您可以选择不调用所有内容时,有时会更方便一旦。有些变量可能您还不想被调用,因此您可以稍后再调用它们。
示例test.bat
@echo off
rem This is added just to test the all parameter
set "test_parameter_all=1st set: The 'all' parameter was NOT used before this echo"
call config.bat size
echo My birthday present had a width of %width% and a height of %height%
call config.bat family
call config.bat animals
echo Yesterday %father% and %mother% surprised %sister% with a cat named %cat%
echo Her brother wanted the dog %dog%
rem This shows you if the 'all' parameter was or not used (just for testing)
echo %test_parameter_all%
call config.bat color
echo His lucky color is %first_color% even if %second_color% is also nice.
echo.
pause
希望它能帮助其他人在这里为我提供答案。
上面的简短版本:
config.bat
@echo off
set config_all_selected=
goto :config_%1
goto :end
:config_all
set config_all_selected=1
:config_family
set mother=Mary
set father=John
set daughter=Anna
if not "%config_all_selected%"=="1" goto :end
:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end
:end
测试棒
@echo off
call config.bat size
echo My birthday present had a width of %width% and a height of %height%
call config.bat family
echo %father% and %mother% have a daughter named %daughter%
echo.
pause
美好的一天。
让我们不要忘记良好的旧参数。启动* .bat或* .cmd文件时,可以在命令文件名后最多添加九个参数:
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:\>