【问题标题】:Looping through input parameter in batch file循环通过批处理文件中的输入参数
【发布时间】:2019-11-13 05:43:42
【问题描述】:

我有一个批处理文件,我想将文件夹连接到 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

现在它只是应该回显文件夹名称。 我期望的结果是

\文件夹1
\文件夹2
\文件夹3

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

"\Folder2]" kann syntaktisch an dieser Stelle nicht verarbeitet 韦尔登。

我做错了什么/错过了什么?

【问题讨论】:

  • 如果要将值连接到 PATH 变量,请使用以下形式:set "PATH=%PATH%;new value"。如果值在引号中的第一个参数中给出,请使用:set "PATH=%PATH%;%~1"
  • @Aacini 是的,我知道,但我想不使用 Folder1 Folder2 Folder3 而是使用 C:\Temp\Folder1 C:\Temp\Folder2 等连接 PATH 变量(仅作为示例)。但是,文件夹需要像我写的那样通过参数。所以问题不是真正设置 PATH 而是分隔字符串。
  • 那么你应该在问题中解释那个。您的问题根本与 PATH 变量无关。我建议您完全重写问题并更改标题...顺便说一句,为了解决您的问题,请将 FOR 命令更改为:FOR /f "tokens=1* delims=;" %%a IN ("%FOLDERS%") DO (,即将 FOLDERS 变量括在引号中并将左括号放在同一行...

标签: batch-file


【解决方案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只有一个文件夹名称。

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

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

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

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

对于字符串比较,建议使用if "%FOLDERS%" == "",即将比较的两个字符串两边用双引号括起来,这样分配给环境变量FOLDERS的字符串值不应包含一个或多个",其中如果这个字符串比较会失败。有关使用命令 IF 进行字符串比较的详细信息,请参阅我在Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files 上的回答。

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

另见How does the Windows Command Interpreter (CMD.EXE) parse scripts?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多