批处理文件包含用于变量的外部文件


Answers:


132

注意:我假设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在每行上使用。该报价是有逃避之类的东西<>&|。但是,当输入中使用引号时,它们本身将中断。另外,在进一步处理以此类字符存储的变量中的数据时,您始终需要小心。

通常,对我来说,自动转义任意输入以使批处理文件不会引起麻烦或问题似乎是不可能的。至少我还没有找到一种方法。当然,使用第一个解决方案,您会将这种责任推给编写配置文件的责任。


这并没有为我工作,你可以请检查:stackoverflow.com/questions/46147450/...
纳吉布埃哈卜

35

如果外部配置文件也是有效的批处理文件,则可以使用:

call externalconfig.bat

在您的脚本中。尝试创建以下a.bat:

@echo off
call b.bat
echo %MYVAR%

和b.bat:

set MYVAR=test

运行a.bat应该生成输出:

test

这并没有为我工作,你可以请检查:stackoverflow.com/questions/46147450/...
纳吉布埃哈卜

如果在另一个脚本中并行使用config文件(使用call,即btw同步调用),则会显示“该进程由于正在使用该文件而无法访问该文件”,因此无法调用。
domih

2

批处理使用小于和大于括号作为输入和输出管道。

>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”要容易得多。:)


1

所以您只需要正确执行此操作?:

@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

0
:: 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

上面概述的技术还可以用于在多个批处理文件之间共享变量。

资料来源:http : //www.incodesystems.com/products/batchfi1.htm


0

有点老的话题,但几天前我有一个相同的问题,我想出了另一个主意(也许有人会觉得有用)

例如,您可以使用不同的主题(家庭,大小,颜色,动物)制作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

美好的一天。


-2

让我们不要忘记良好的旧参数。启动* .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:\>

-3

在尝试使用具有可执行配置的方法时,我注意到该方法可能有效或无效,具体取决于脚本中的调用位置:

调用config.cmd

我知道这没有任何意义,但是对我来说这是事实。当“ call config.cmd”位于脚本顶部时,它可以工作,但是如果在脚本中更远,则不能。

通过不起作用,我的意思是未在调用脚本中设置变量。

非常非常奇怪!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.