批处理循环将空间划分的input作为单个令牌处理

我正在处理一个批处理脚本,它假设提示用户列出项目列表,然后依次处理每个项目。 我的想法是,这可以做一个for循环,但它不工作。 出于某种原因,它将用户input的整个string( CanalyzerIF CanoeIF CometIF )视为一个单一的标记。

 echo Enter the names of the projects, deliniating each with a space: set /P PROJECT_LIST= echo. echo DEBUG: PROJECT_LIST is %PROJECT_LIST% echo These are the projects you specified: for /F "tokens=*" %%i in ("%PROJECT_LIST%") do ( echo %%i ) 

我的脚本输出看起来像这样…

 DEBUG: PROJECT_LIST is CanalyzerIF CanoeIF CometIF These are the projects you specified: CanalyzerIF CanoeIF CometIF 

…当我期望/想看到的是这样的:

 DEBUG: PROJECT_LIST is CanalyzerIF CanoeIF CometIF These are the projects you specified: CanalyzerIF CanoeIF CometIF 

如果使用百分号( % )或感叹号( ! )来包装PROJECT_LIST似乎并不重要。 有人知道怎么修这个东西吗?

尝试用(普通的FOR可以用于):

 echo Enter the names of the projects, deliniating each with a space: set /P "PROJECT_LIST=" echo. echo DEBUG: PROJECT_LIST is %PROJECT_LIST% echo These are the projects you specified: for %%i in (%PROJECT_LIST%) do ( echo %%i ) 

除了@ npocmaka完美的解决方案使用无/F的问题,我想提供一个解决方案的/F选项,主要是为了演示的目的。

首先让我们来看看for /F没有选项字符串,所以使用默认选项,就像"tokens=1 delims= _"_代表一个标签在这里)。 这意味着要采取第一个空格或制表符分隔的标记,并将其分配给一个给定的变量,如%%i (即列表中的第一个项目),并忽略其余的。
要获得多个项目,您需要明确指定要提取的项目。 例如,要获得标记2,3,4和6,请"tokens=2-4,6"
这些令牌中的第一个被分配给给定的变量%%i ,其他的给%%j%%k%%l (它们构成了隐式定义的变量)。
特殊标记*表示将所有剩余的标记传递给一个变量,换句话说就是将它们作为单个标记(例如, "tokens=1,*"将第一个标记传递给%%i ,所有的休息到%%j )。

了解所有这些将导致我们使用for /F的主要问题:您需要知道有多少令牌可用。 但是对于这个应用程序,我们不知道。

以下使用选项字符串"tokens=1,*"来提取第一个令牌和所有其余的; 有一种while循环(由ifgoto组成),用来重新处理所有其他的东西,直到没有东西可用为止(这里我明确地定义了空间是唯一可接受的分隔符):

 echo Enter the names of the projects, deliniating each with a space: set /P PROJECT_LIST= echo. echo DEBUG: PROJECT_LIST is %PROJECT_LIST% echo These are the projects you specified: set PROJECT_TEMP=%PROJECT_LIST% :LOOP if not defined PROJECT_TEMP goto :NEXT for /F "tokens=1,* delims= " %%i in ("%PROJECT_TEMP%") do ( echo. %%i set PROJECT_TEMP=%%j ) goto :LOOP :NEXT 

所以原始代码中的主要问题是选项字符串"tokens=*" ,它定义将所有的标记传递给变量%%i

for /? 了解更多关于这一切的细节。