我正在编写一个批处理脚本,该脚本应该提示用户输入项目列表,然后依次处理每个项目。我的想法是,这可以用for循环来完成,但它不起作用。由于某种原因,它将用户(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
似乎并不重要。有人知道怎么解决这个问题吗?
try with(纯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使用for
而不使用/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-loop(由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 /?
查看更多详细信息