【发布时间】:2016-02-01 21:40:49
【问题描述】:
我有一种情况,我试图将相关项目的静态列表保存在字符串中,并将它们作为 bat 文件中的集合解析出来。
SET RootPath=C:\Users\woodh\test\
SET FromPath=StuffFrom\
SET ToPath=StuffTo\
SET CTLNames='text1.txt,red_text1:text2.txt,white_text2:text3.txt,blue_text3:'
CTLNames 包含要在作业中解析和使用的条目对。
我做了以下
:Step20
rem -----------------------------------------------------------------
rem loop thru all files in the control list processing each pair at a time
rem -----------------------------------------------------------------
FOR /F "delims=:" %%f IN (%CTLNames%) DO (
IF NOT "%%f" == "" (
CALL:BreakEntry "%%f"
)
)
:Finish
rem ----------------------------------------------------------------
rem -- Finish
rem ----------------------------------------------------------------
goto end
:BreakEntry
rem -----------------------------------------------------------------
rem loop thru all files in the control list processing each entry one at a time
rem -----------------------------------------------------------------
Set EntryLine=%~1
IF NOT "%EntryLine%" == "" (
ECHO %EntryLine%
FOR /F "tokens=1,2 delims=," %%a IN ("%EntryLine%") DO (
ECHO %%a
ECHO %%b
CALL:MoveThisFile %%a, %%b
)
)
goto:eof
但它只处理第一对名称,而不是继续处理列表的其余部分。
【问题讨论】:
-
CTLNames中的 : 是否必须分隔对(而 , 分隔一对元素)? -
批处理不是结构化语言,因此我不会费心阅读这个可怕的批处理代码(在另一种语言中可能很漂亮,但不是批处理)。但是您可能需要打开
ENABLEDELAYEDEXPANSION(请参阅setlocal /?)。请参阅您的变量!var!。请参阅for /?了解详细信息(并解释原因)。 -
@bgalea - IMO
rem语句应该在标签上方,有很多不必要的空行,命令不需要全部上限,但它是完全合理的批次。 -
您应该从
SET CTLNames='...'命令行中删除单引号',因为它成为变量值的一部分,因此您需要处理它们,并且它们在无论如何都要批处理;最好在整个表达式周围加上双引号",例如SET "CTLNames=...",以避免某些特殊字符出现问题,并且它们 not 会成为变量值的一部分...
标签: string loops parsing batch-file