这是在Windows批处理的错误?

我发现批处理脚本的一个奇怪的问题,我似乎无法解释。 也许只是因为我不太了解批处理工作的基础,但是这里是一个例子batch file(test.bat):

@echo off FOR /F "tokens=1*" %%i in ("%*") DO ( echo %%j ) 

如果我这样称呼它:

 test.bat ab a,b "a,b" 

我得到这个作为我的输出:

 a,b "ab" 

为什么第二个逗号被剥离? 如果我像这样逃避逗号:

 test.bat ab a,b "a^,b" 

我得到正确的输出:

 a,b "a,b" 

这几乎就像','被for循环认为是一个分隔符,但是当我看着FOR /?时,唯一的默认delim就是空白。 逗号不被列为分隔符。 如果我明确指出delim是一个空格,我仍然会得到这个行为。 如果我逃避报价,我仍然得到这种行为。 不pipe怎样,如果逗号是分号,那么第一个逗号也应该被剥离出来吗? 奇怪的是,如果你尝试在for循环中使用'usebackq',你会得到相反的结果。 第一个逗号被删除,第二个被保留:

 ab "a,b" 

为什么我必须在引号内跳过所有逗号才能工作? 是否有一些whindows规则我失踪或者它只是在Windows批处理脚本错误?

Solutions Collecting From Web of "这是在Windows批处理的错误?"

  1. 逗号是命令行中的分隔符如果第一个参数带有逗号,则读取批处理文件中的第二个参数
  2. 当您FOR /F "tokens=1*" %%i in ("%*")调用FOR /F "tokens=1*" %%i in ("%*")时,展开时

    FOR / F“tokens = 1 *”%% i in(“ab a,b”a,b“”)现在你看到你有双引号开关两次了。 希望这可以帮助。

  3. 我的建议,如果你需要复杂的命令行参数解析使用
 :loop rem you code here shift goto :loop 

使用%*时有一些限制。

 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET "line=aba,b "a,b"" SET line ECHO [%*] FOR /f "tokens=1*" %%i IN ("%*") DO (ECHO %%j) FOR /f "tokens=1*" %%i IN ("%line%") DO (ECHO %%j) FOR /f "tokens=1*" %%i IN ("!line!") DO (ECHO %%j) FOR /f "tokens=1*" %%i IN ('echo %line%') DO (ECHO %%j) GOTO :EOF 

运行以上可能会指出一个解释。 这完全是一个历史的问题 – 相当当一个替代 – %var%首先,%% x秒和!var! 第三。