我正在处理一个批处理脚本,它假设提示用户列出项目列表,然后依次处理每个项目。 我的想法是,这可以做一个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循环(由if
和goto
组成),用来重新处理所有其他的东西,直到没有东西可用为止(这里我明确地定义了空间是唯一可接受的分隔符):
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 /?
了解更多关于这一切的细节。