2015-04-16 35 views
2

我在一个简单的批处理命令中遇到问题,我无法理解为什么“令牌”选项无法正常工作。我想要做的是使用dir命令在批处理文件中列出文件夹的内容,并过滤输出以仅显示文件的大小和名称。还有一个我会将输出重定向到一个文件。批量令牌问题

例如,包含3个PDF文件的文件夹中执行的默认目录输出如下:

Volume in drive C is Windows 
Volume Serial Number is 8E72-826A 

Directory of C:\Test 

16.04.2015 08:36 <DIR>   . 
16.04.2015 08:36 <DIR>   .. 
02.07.2014 14:35   428.974 Metrou (2).pdf 
02.07.2014 14:35   428.974 Metrou (3).pdf 
02.07.2014 14:35   428.974 Metrou.pdf 
       3 File(s)  1.286.922 bytes 
       2 Dir(s) 123.298.713.600 bytes free 

我试图获得如下结果:

428.974 Metrou (2).pdf 
428.974 Metrou (3).pdf 
428.974 Metrou.pdf 

为了实现我正在尝试以下代码:

FOR /f "tokens=3,*" %%G IN ('dir C:\Test\*.* ^| find "pdf"') DO echo %%G >> abo.txt 

结果只有大小,我i ŝ确实令牌3,但它应该继续与剩下的令牌我如何指示:*后3

428.974 
428.974 
428.974 

我也试图与其他选项“令牌= 3 *”,但具有相同的结果。如果我改变令牌其他号码2为例,它正确地显示了小时在我们的例子:

14:35 
14:35 
14:35 

所以它似乎是阅读我的令牌选项,但只有=后面的第一个数字。我没有使用过delims,因为输出只有空格,默认情况下这个空格是作为分隔符读取的,我也可能在他们的名字中包含空格的文件,就像上面的例子。 此外,代码将保存在.bat文件中。

任何想法为什么它忽略*或*标记?

感谢和问候,

尤利安

+0

'找到 “PDF” 将找到'pdf',但不是'PDF '。你应该使用'/ i'参数。无论如何:你为什么使用'find“pdf而不是'dir * .pdf'? – Stephan

+0

这的确更短,谢谢Stephan! – iconstan

+0

Stephan,实际上dir * .pdf会传递给输出,它将被重定向到一个文件,我不需要这些文件。例如:驱动器C是Windows 编号是8E72-826A C:\ Users \%userprofile%\ Desktop和底部的磁盘空间信息:879.104字节 123.234.299.904字节空闲 – iconstan

回答

2

随着令牌设置为3,*%%G将获得第三个令牌和%%H将得到*(行的其余部分)。

tokens的想法是,环境变量的系列已填充,从列出的那个开始。从for /?的输出(与我的斜体字):

tokens=x,y,m-n

指定从各线令牌将被传递给for体对于每次迭代。

这将导致额外的变量名称被分配。

m-n表格是一个范围,指定了mn个令牌。

如果tokens=字符串中的最后一个字符是星号,则会分配一个附加变量,并在最后一个标记解析后接收该行上的剩余文本。

因此,你将需要类似(同额外%%H):

FOR /f "tokens=3,*" %%G IN ('dir C:\Test\*.* ^| find "pdf"') DO echo %%G %%H >> abo.txt 

举例来说,这里是我的系统上的输出(去掉无关的线条):

C:\pax> dir | findstr pdf 
15/01/2015 09:43 AM   3,788,603 n1256_c99.pdf 
03/12/2014 12:06 PM   1,692,004 n1570_c11.pdf 
08/12/2014 09:48 AM   5,075,816 n3337_c++11.pdf 
08/04/2015 11:11 AM   4,654,119 The Swift Programming Language.pdf 

C:\pax> FOR /f "tokens=4,*" %G IN ('dir ^| findstr pdf') DO echo %G ... %H 
3,788,603 ... n1256_c99.pdf 
1,692,004 ... n1570_c11.pdf 
5,075,816 ... n3337_c++11.pdf 
4,654,119 ... The Swift Programming Language.pdf 
+0

谢谢paxdiablo,它现在工作完美! – iconstan

1

这将独立于本地化工作:

for %%i in (c:\test\*.pdf) do echo %%~zi %%~nxi 

尽管大小没有用逗号格式化(根据您的需要,这可能是好的或坏的)。

看到for /?的修饰%%~zi%%~nxi

已经在输出中对齐,可以使用稍微修改:

@echo off 
setlocal enabledelayedexpansion 
for %%i in (*.txt) do (
    set "size=%%~zi   " 
    echo !size:~0,10! %%~nxi 
) 
+0

嗨Stephan,这是另一个有用的代码,谢谢! – iconstan