Batch For循环将空间描述的输入作为单个令牌处理



我正在编写一个批处理脚本,该脚本应该提示用户输入项目列表,然后依次处理每个项目。我的想法是,这可以用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(由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 /?查看更多详细信息

相关内容

  • 没有找到相关文章

最新更新