在批处理文件中循环输入参数

时间:2019-07-02 14:32:11

标签: batch-file

我有一个批处理文件,我想在其中将文件夹隐藏为PATH变量。
文件夹应通过参数分配给批次。

我会这样称呼文件:

  

set_path.bat“ \ Folder1; \ Folder2; \ Folder3”

现在我有这个:

set FOLDERS=%1
set FOLDERS=%FOLDERS:"=%

:NextItem
if [%FOLDERS%] == [] goto EOF

FOR /f "tokens=1* delims=;" %%a IN (%FOLDERS%) DO 
(
echo %%a
set "FOLDERS=%%b"
)

goto NextItem

:EOF

现在,仅应回显文件夹名称。 我期望的结果是

  

\ Folder1
  \ Folder2
  \ Folder3

但是,如果我尝试这样做,我会在set FOLDERS=\Folder1,\Folder2之后出现错误:

“ \ Folder2]”坎特·辛塔克蒂施(Stann nicht verarbeitet)  沃登。

我在做什么错/想念?

1 个答案:

答案 0 :(得分:1)

我建议使用以下批处理文件代码:

@echo off
set "Folders=%~1"

:NextFolderPath
for /F "tokens=1* delims=;" %%I in ("%Folders%") do (
    echo %%I
    set "Folders=%%J"
    if defined Folders goto NextFolderPath
)

运行此批处理文件时,分配给环境变量Folders的字符串为\Folder1;\Folder2;\Folder3,其中"\Folder1;\Folder2;\Folder3"作为第一个也是唯一的参数字符串。由于使用%~1而不是%1,Windows命令处理器删除了参数字符串周围的双引号。通过在命令提示符窗口call /?中运行时获得的帮助输出来解释此行为。

命令 FOR 用于拆分当前分配给用双引号引起来的环境变量Folders字符串

由于tokens=1* delims=;,带有分号分隔的文件夹路径列表的字符串被分为两个子字符串(令牌)。第一个;分隔的字符串始终分配给指定的循环变量I。由于此字符串绝不会以分号开头,因为分号是定界符,因此默认的eol=;在这里并不重要。第二个字符串是根据ASCII表将第一个文件夹路径字符串之后一个或多个分号后的所有内容分配给下一个循环变量J

仅输出分配给循环变量I的文件夹路径字符串。其余的文件夹路径再次分配给环境变量Folders,该环境变量现在比以前少了一个文件夹路径,或者由于循环的当前迭代中仅包含Folders而不再定义名称。

由于仍然需要处理一个或多个文件夹路径,因此在仍定义的环境变量Folders上再次执行命令 FOR 。否则,批处理文件的处理将以到达批处理文件的结尾结束。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /? ...解释%~1
  • echo /?
  • for /?
  • goto /?
  • if /?
  • set /?

另请参见Where does GOTO :EOF return to?,我建议避免在将来定义标签:EOF。如果不想使用:EndBatch,则在批处理文件goto :EOF的末尾用作标签。

对于字符串比较,建议使用if "%FOLDERS%" == "",即,将两个比较的字符串都用双引号引起来,这样,分配给环境变量FOLDERS的字符串值不应包含一个或多个{ {1}}在这种情况下,此字符串比较将失败。有关使用命令 IF 比较字符串的详细信息,请参见我在Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files上的回答。

"通常不好,因为与if [%FOLDERS%] == []相比,方括号没有特殊含义。 Windows命令处理器在处理和执行 IF 条件命令行(例如字母"[)时会解释]X。但是Y具有特殊含义,因为除"之外的所有字符以及启用了%的{​​{1}}都在双引号参数字符串中解释为包括命令运算符的文字字符。 !&&&以及重定向操作符||<>>>以及圆括号|(

另请参阅delayed expansion