将可配置变量加载到bat文件中

时间:2017-12-08 03:57:14

标签: windows batch-file cmd

我有以下配置文件

[CLIENT1]
drive='C:/CLIENT1'
client='1'
[CLIENT2]
drive='C:/CLIENT2'
client='2'

我正在尝试从命令行将参数传递给我的bat文件,该命令行将是CLIENT1或CLIENT2。目的是加载驱动器并使用clientid进入bat脚本以更改当前工作目录。

像这样的东西

@ECHO OFF

set param=CLIENT1

for /f "delims=" %%x in (config.txt) do (
   IF "%%x" == "[%PARAM%]" 
      (
         # Load the next two lines of code to set the variables
         set var1=line1
         set var2=line2
      )
)

echo var1 var2
pause

在确定已找到bat文件已运行的记录后,我无法想出加载变量的正确方法。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我最后编写了下面的脚本,有人可以查看它并让我知道我是否可以做得更好或利用一些功能使这个脚本更整洁?

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
set param=CLIENT1
set /A count=0

for /f "delims=." %%x in (config.txt) do (
   set /A count=count+1 
   if "%%x" == "[%PARAM%]" goto :break
)

ECHO didnt find it
goto :exit 

:break
set "drive="   
set "id="
for /f "skip=%count% tokens= 1, 2 delims==" %%A in (config.txt) do (
   if %%A==drive set drive=%%B
   if %%A==client set id=%%B
   if defined drive if defined id goto :exit
)

:exit
ECHO drive - %drive%
ECHO id - %id%
endlocal
pause

输出:

drive - 'C:/CLIENT1'
id - '1'

我计划将基于这种逻辑的东西交给工作中的同事,我希望它不会太糟糕。

感谢。

答案 1 :(得分:0)

@ECHO OFF
setlocal
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q47707478.txt"
FOR %%a IN (drive client assign) DO SET "%%a="
FOR /f "usebackqtokens=1*delims==" %%a IN ("%filename1%") DO (
 IF /i "%%a"=="[%1]" (
  SET "assign=Y"
 ) ELSE IF DEFINED assign (
  FOR %%v IN (drive client) DO IF /i "%%a"=="%%v" SET "%%a=%%b"
  IF "%%b"=="" SET "assign="
 )
)
IF DEFINED drive SET "drive=%drive:'=%"
IF DEFINED client SET "client=%client:'=%"
endlocal&SET "drive=%drive%"&SET "client=%client%"
GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q47707478.txt的文件,其中包含我的测试数据。

我只是使用sourcedirfilename1来适应我的测试 - 如果您愿意,请使用filename1的固定名称。

filename1只有在包含 Space 之类的分隔符时才需要引用。如果未引用,请删除usebackq选项(告知for所引用的名称是文件名)

首先将drive,client,assign设置为 no ,以防它们已有值。

然后阅读文件,使用%%a作为分隔符,将第一个标记分配给%%b,将剩余的标记分配给=

如果我们找到目标字符串,请将assign设置为 - 无论 值是什么,只需就不是 < / p>

如果找不到目标字符串,那么如果已找到目标字符串(因此定义了assign),则查看%%a是否是必需字符串之一。如果是的话。

如果没有第二个令牌(在%%b中),我们就找到了下一个[sectionname],因此我们已经完成了目标部分,因此请设置assign nothing 以阻止进一步的分配。

最后,从指定的变量中删除'个字符(如果需要)。

注意:

/i语句中的if使比较不区分大小写。如果需要,删除。

&#34;过于复杂&#34;使用%%v进行操作可以轻松扩展返回的变量列表(在明显位置进行匹配更改)。

endlocal将处理自setlocal以来例程所做的任何环境更改,但明显多余的任务(必须位于同一物理线路上)使用cmd的解析特性将变量从本地环境传输到主环境。

如果您想从id中的值返回client,只需将endlocal&SE..."&SET "client=%client%"更改为endlocal&SE..."&SET "id=%client%"

如果你想为目录分隔符返回windows-standard \/是一个开关指示符),那么在endlocal行之前添加一个新行

IF DEFINED drive SET "drive=%drive:/=\%"