如何从绝对路径列表中回显文件大小

时间:2013-04-10 09:11:28

标签: windows for-loop batch-file cmd directory

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

3 个答案:

答案 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

代码与已发布的代码和在这些帖子中发表的评论确实没有太大差别。