Batch file Can';t在for/f循环中获取完整的第二个参数

Batch file Can';t在for/f循环中获取完整的第二个参数,batch-file,for-loop,Batch File,For Loop,我有一个这样的文件: 001;0009;024;165748;0634;;CAPO; 001;0009;030;143366;0633;;CAPO; 001;0009;030;160671;0644;31/05/2018;PART; 001;0009;030;160857;0644;;PART; 001;0009;031;168135;0644;;PART; 001;0009;046;168085;0612;;CAPO; 002;0002;007;286169;4013;21/03/2018;P

我有一个这样的文件:

001;0009;024;165748;0634;;CAPO;
001;0009;030;143366;0633;;CAPO;
001;0009;030;160671;0644;31/05/2018;PART;
001;0009;030;160857;0644;;PART;
001;0009;031;168135;0644;;PART;
001;0009;046;168085;0612;;CAPO;
002;0002;007;286169;4013;21/03/2018;PART;
002;0002;009;053175;4013;;PART;
002;0002;026;241075;4023;01/02/2018;PART;
002;0002;026;241076;4023;01/02/2018;PART;
002;0002;026;241102;4023;;PART;
我需要的是创建多个文件,当前3个字符更改时会断开,每个文件都用前3个字符命名。 所以,按照这个例子,我将

001.txt与

001;0009;024;165748;0634;;CAPO;
001;0009;030;143366;0633;;CAPO;
001;0009;030;160671;0644;31/05/2018;PART;
001;0009;030;160857;0644;;PART;
001;0009;031;168135;0644;;PART;
001;0009;046;168085;0612;;CAPO;
field1;field2;field3;field4;field5;field6;field7;field8
001;0009
001;0009
001;0009
001;0009
001;0009
001;0009
002.txt与

002;0002;007;286169;4013;21/03/2018;PART;
002;0002;009;053175;4013;;PART;
002;0002;026;241075;4023;01/02/2018;PART;
002;0002;026;241076;4023;01/02/2018;PART;
002;0002;026;241102;4023;;PART;
field1;field2;field3;field4;field5;field6;field7;field8
002;0002
002;0002
002;0002
002;0002
002;0002
我通过这批产品部分实现了这一目标:

@@echo off
setlocal ENABLEDELAYEDEXPANSION
@echo Wait please...
set header=field1;field2;field3;field4;field5;field6;field7;field8
set craold=""
set cranow=""
FOR /F "eol=; tokens=1,* delims=;" %%a in (myfilename.csv) do call :doTheWork %%a %%b
@echo Ended
pause
GOTO :EOF

:doTheWork
set cranow=%1
IF NOT !craold!==!cranow! (
   call :createFile %cranow%
   set craold=!cranow!
)
set recfilename=%craold%.txt
@echo %1;%2 >> %recfilename%
GOTO :END

:createFile
set myfilename=%1.txt
@echo %header% > %myfilename%
@echo CRA: %1
GOTO :END

:END
我的问题是,在我的文件中,我只发现以下内容:

001.txt与

001;0009;024;165748;0634;;CAPO;
001;0009;030;143366;0633;;CAPO;
001;0009;030;160671;0644;31/05/2018;PART;
001;0009;030;160857;0644;;PART;
001;0009;031;168135;0644;;PART;
001;0009;046;168085;0612;;CAPO;
field1;field2;field3;field4;field5;field6;field7;field8
001;0009
001;0009
001;0009
001;0009
001;0009
001;0009
002.txt与

002;0002;007;286169;4013;21/03/2018;PART;
002;0002;009;053175;4013;;PART;
002;0002;026;241075;4023;01/02/2018;PART;
002;0002;026;241076;4023;01/02/2018;PART;
002;0002;026;241102;4023;;PART;
field1;field2;field3;field4;field5;field6;field7;field8
002;0002
002;0002
002;0002
002;0002
002;0002
似乎“eol=;tokens=1,*delims=;”无法正常工作,忘记了“tokens”pragma的第二个参数应该占用输入行的其余部分。 为什么?建议


谢谢

问题不是由
for/F
及其
标记=
选项字符串引起的,而是由
call
的未引用参数引起的,因此
%2
在第一次
时被拆分
,它只是
cmd
中的一个普通标记分隔符(就像空格、制表符、
=

要更正此问题,请引用
call
参数以保护令牌分隔符和其他特殊字符:

调用“%%a”“%%b”
并阅读如下参数以删除引号:

echo%~1;%~2.
最后,我建议您将
set
语法更改为:

set“header=field1;field2;field3;field4;field5;field6;field7;field8”

引号不会成为此处变量值的一部分,但特殊字符会受到保护。

根据我的初始注释和您的新测试,如注释所示:

不需要设置任何变量,因此预先设置延迟扩展,因为您不需要修改返回的元变量

您应该在
Call
命令中双引号引用传递的参数,以保护特殊字符,例如…
分号、

For/F“Tokens=1*Delims=;”%%A In(reporti.csv)Do(
回显在循环%%A;%%B中
呼叫:doTheWork%%A“%%B”
)
:doTheWork
中,您可以根据需要将周围的双引号从
%2
中删除,方法是将其称为
%2


无论内容如何,我都建议使用双引号,但根据已知信息,我将其保留为必要的双引号。

您是否可以运行此命令,
For/F“Tokens=1*Delims=;“%%A In(myfilename.csv)Do(Echo%%A;%%B)>”%%A.txt“
,然后将您的头添加到每个标记中?删除
eol=
@AlexP,
eol=
实际上在这里禁用了
eol
字符,因为它与(其中一个)定界符相同,具有更高的优先级…
Tokens=1,*
工作正常,但问题是由
call
的非引号参数引起的,因此
%2
被第一个
拆分
,它只是
cmd
中的一个普通标记分隔符;使用
call:doTheWork“%%a”“%%b”
并分别读取
%~1
%~2
等参数,以便保留这些参数……我做了一个新的测试,其中做了一些更改:'FOR/F“tokens=1,*delims=;“%%a in(reporti.csv)do(set param1=%%a set param2=%%b@echo In loop!param1!!param2!call:doTheWork!param1!!param2!)嗯,控制台上的echo是正确的,这两个参数按预期显示。问题似乎是在传递到子例程的过程中。。。