我有一个文件“file_list.txt”,其中包含文件列表的绝对路径。每行以分号结尾。该文件显示如下。
"C:\Users\ab cd\AK\AK_PPF.pdf";
"C:\Users\ab cd\AK\AK_PPF.jpg";
"C:\Users\ab cd\AK\DL PAGE 1.jpg";
"C:\Users\ab cd\AK\dl pAGE 2.jpg";
"C:\Users\ab cd\AK\dl pAGE 3.jpg";
我编写了以下代码来回显每个文件的文件大小。
@echo off
setlocal
set v_file_list="file_list.txt"
FOR /F "delim=; tokens=1 usebackq" %%A IN (%v_file_list%) DO @echo %%~zA
当我运行批处理文件时,它显示“delim =; tokens = 1 usebackq”此时意外
请告诉我这里做错了什么。
答案 0 :(得分:3)
您应该使用delims
代替delim
。这也在领先地位。
答案 1 :(得分:2)
Endoro确定了您的语法错误 - 拼写错误的DELIMS=;
选项。
您还有另一个潜在问题:;
是一个可以出现在文件或路径名中的有效字符。名称中的;
很少见,但它确实会一次又一次地出现。您的DELIMS=;
将损坏(截断)包含;
的任何路径。
您应该使用其他技术来消除不必要的尾随;
。
您可以使用扩展子字符串操作来删除最后一个字符,但这需要在同一个循环中设置和扩展变量,这需要CALL或延迟扩展。 CALL很昂贵(慢),如果%%A
包含!
(文件名的另一个罕见但有效的字符),则延迟扩展会破坏;
的扩展。所以延迟扩张必须适当地开关。
有一个更简单的解决方案依赖于您的文件路径用引号括起来,;
在引号之外。您可以使用其他FOR语句来删除尾随;
,因为for /f "usebackq delims=" %%A in (%v_file_list%) do for %%F in (%%A) do @echo %%~zF
是简单FOR语句的标记分隔符(不带/ F选项)。
{{1}}
答案 2 :(得分:0)
至少这个领域的人在很大程度上是建设性的 - 围绕而不是系统地投票/删除/关闭不喜欢的问题和答案来反复思考。
这是我的贡献,FWIW:
原始问题,带有分号:
@echo off
SETLOCAL
ECHO.== file_list.txt ==========
TYPE file_list.txt
set v_file_list="file_list.txt"
ECHO.== batch run ==========
FOR /F "usebackqdelims=" %%A IN (%v_file_list%) DO (
SET filename=%%A
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%s IN (!filename!) DO (endlocal&ECHO %%s %%~zs)
)
ECHO.== actual DIR list ==========
DIR /a-d "u:\users\ab cd\ak"
运行结果:
== file_list.txt ==========
"u:\users\ab cd\ak\ak_ppf.pdf";
"u:\users\ab cd\ak\ak_ppf.jpg";
"u:\users\ab cd\ak\dl page 1.jpg";
"u:\users\ab cd\ak\dl page 2.jpg";
"u:\users\ab cd\ak\dl page 3.jpg";
"u:\users\ab cd\ak\dl page;4.jpg;";
"u:\users\ab cd\ak\dl page;4.jpg";
"u:\users\ab cd\ak\dl!page;4.jpg;";
"u:\users\ab cd\ak\dl%page%;4.jpg;";
"u:\users\ab cd\ak\dl!pag!e;4.jpg;";
== batch run ==========
"u:\users\ab cd\ak\ak_ppf.pdf" 21031
"u:\users\ab cd\ak\ak_ppf.jpg" 428
"u:\users\ab cd\ak\dl page 1.jpg" 54338
"u:\users\ab cd\ak\dl page 2.jpg" 83344
"u:\users\ab cd\ak\dl page 3.jpg" 14036
"u:\users\ab cd\ak\dl page;4.jpg;" 22498
"u:\users\ab cd\ak\dl page;4.jpg" 55506
"u:\users\ab cd\ak\dl!page;4.jpg;" 4007
"u:\users\ab cd\ak\dl%page%;4.jpg;" 5310
"u:\users\ab cd\ak\dl!pag!e;4.jpg;" 4693
== actual DIR list ==========
Volume in drive U has no label.
Volume Serial Number is 0466-0000
Directory of u:\users\ab cd\ak
10/04/2013 20:25 21,031 ak_ppf.pdf
10/04/2013 20:25 428 ak_ppf.jpg
10/04/2013 20:25 54,338 dl page 1.jpg
10/04/2013 20:26 83,344 dl page 2.jpg
10/04/2013 20:26 14,036 dl page 3.jpg
10/04/2013 20:41 22,498 dl page;4.jpg;
10/04/2013 20:40 55,506 dl page;4.jpg
10/04/2013 20:49 4,007 dl!page;4.jpg;
10/04/2013 20:50 5,310 dl%page%;4.jpg;
10/04/2013 21:31 4,693 dl!pag!e;4.jpg;
10 File(s) 265,191 bytes
0 Dir(s) 2,146,500,608 bytes free
一般示例,文本文件仅限文件名:
@echo off
SETLOCAL
ECHO.== file_list_raw.txt ==========
TYPE file_list_raw.txt
set v_file_list="file_list_raw.txt"
ECHO.== batch run ==========
FOR /F "usebackqdelims=" %%A IN (%v_file_list%) DO (
SET filename="%%~A"
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%s IN (!filename!) DO (endlocal&ECHO %%s %%~zs)
)
ECHO.== actual DIR list ==========
DIR /a-d "u:\users\ab cd\ak"
运行结果:
== file_list_raw.txt ==========
U:\users\ab cd\ak\ak_ppf.pdf
U:\users\ab cd\ak\ak_ppf.jpg
U:\users\ab cd\ak\dl page 1.jpg
U:\users\ab cd\ak\dl page 2.jpg
U:\users\ab cd\ak\dl page 3.jpg
U:\users\ab cd\ak\dl page;4.jpg;
U:\users\ab cd\ak\dl page;4.jpg
U:\users\ab cd\ak\dl!page;4.jpg;
U:\users\ab cd\ak\dl%page%;4.jpg;
U:\users\ab cd\ak\dl!pag!e;4.jpg;
"U:\users\ab cd\ak\ak_ppf.pdf"
"U:\users\ab cd\ak\ak_ppf.jpg"
"U:\users\ab cd\ak\dl page 1.jpg"
"U:\users\ab cd\ak\dl page 2.jpg"
"U:\users\ab cd\ak\dl page 3.jpg"
"U:\users\ab cd\ak\dl page;4.jpg;"
"U:\users\ab cd\ak\dl page;4.jpg"
"U:\users\ab cd\ak\dl!page;4.jpg;"
"U:\users\ab cd\ak\dl%page%;4.jpg;"
"U:\users\ab cd\ak\dl!pag!e;4.jpg;"
== batch run ==========
"U:\users\ab cd\ak\ak_ppf.pdf" 21031
"U:\users\ab cd\ak\ak_ppf.jpg" 428
"U:\users\ab cd\ak\dl page 1.jpg" 54338
"U:\users\ab cd\ak\dl page 2.jpg" 83344
"U:\users\ab cd\ak\dl page 3.jpg" 14036
"U:\users\ab cd\ak\dl page;4.jpg;" 22498
"U:\users\ab cd\ak\dl page;4.jpg" 55506
"U:\users\ab cd\ak\dl!page;4.jpg;" 4007
"U:\users\ab cd\ak\dl%page%;4.jpg;" 5310
"U:\users\ab cd\ak\dl!pag!e;4.jpg;" 4693
"U:\users\ab cd\ak\ak_ppf.pdf" 21031
"U:\users\ab cd\ak\ak_ppf.jpg" 428
"U:\users\ab cd\ak\dl page 1.jpg" 54338
"U:\users\ab cd\ak\dl page 2.jpg" 83344
"U:\users\ab cd\ak\dl page 3.jpg" 14036
"U:\users\ab cd\ak\dl page;4.jpg;" 22498
"U:\users\ab cd\ak\dl page;4.jpg" 55506
"U:\users\ab cd\ak\dl!page;4.jpg;" 4007
"U:\users\ab cd\ak\dl%page%;4.jpg;" 5310
"U:\users\ab cd\ak\dl!pag!e;4.jpg;" 4693
== actual DIR list ==========
Volume in drive U has no label.
Volume Serial Number is 0466-0000
Directory of u:\users\ab cd\ak
10/04/2013 20:25 21,031 ak_ppf.pdf
10/04/2013 20:25 428 ak_ppf.jpg
10/04/2013 20:25 54,338 dl page 1.jpg
10/04/2013 20:26 83,344 dl page 2.jpg
10/04/2013 20:26 14,036 dl page 3.jpg
10/04/2013 20:41 22,498 dl page;4.jpg;
10/04/2013 20:40 55,506 dl page;4.jpg
10/04/2013 20:49 4,007 dl!page;4.jpg;
10/04/2013 20:50 5,310 dl%page%;4.jpg;
10/04/2013 21:31 4,693 dl!pag!e;4.jpg;
10 File(s) 265,191 bytes
0 Dir(s) 2,146,500,608 bytes free
代码与已发布的代码和在这些帖子中发表的评论确实没有太大差别。