我有以下配置文件
[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文件已运行的记录后,我无法想出加载变量的正确方法。
有什么建议吗?
答案 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
的文件,其中包含我的测试数据。
我只是使用sourcedir
和filename1
来适应我的测试 - 如果您愿意,请使用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:/=\%"