0

我有一个文件“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”此时是意外的
请告诉我在这里做错了什么。

4

3 回答 3

3

您应该使用delims而不是delim. 这也处于领先地位。

于 2013-04-10T09:27:36.907 回答
2

Endoro 识别出您的语法错误 - 拼写错误的DELIMS=;选项。

您还有另一个潜在问题:;是一个可以出现在文件或路径名中的有效字符。;在一个名字中很少见,但它确实不时出现。您DELIMS=;将破坏(截断)任何包含;.

您应该使用另一种技术来消除不需要的尾随;

您可以使用扩展子字符串操作来删除最后一个字符,但这需要在同一个循环中设置和扩展变量,这需要调用或延迟扩展。%%ACALL 代价高昂(缓慢),如果包含!(另一个罕见但有效的文件名字符),延迟扩展将破坏扩展。所以延迟扩展必须适当地打开和关闭。

有一个更简单的解决方案,它依赖于您的文件路径用引号括起来的事实,并且在引号;之外。您可以使用附加的 FOR 语句来删除尾随;,因为;它是简单 FOR 语句的标记分隔符(没有 /F 选项)。

for /f "usebackq delims=" %%A in (%v_file_list%) do for %%F in (%%A) do @echo %%~zF
于 2013-04-10T10:47:25.267 回答
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

该代码实际上与已经发布的代码和那些帖子中的评论没有太大区别。

于 2013-04-10T14:06:14.120 回答