批量令牌问题

时间:2015-04-16 07:11:56

标签: batch-file token

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

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

 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

结果只是大小,这确实是令牌3,但它应该继续使用其余的令牌,我指示如何:*,在3之后

428.974 
428.974 
428.974 

我也试过了另一个选项“tokens = 3 *”,但结果相同。如果我将令牌更改为其他号码,例如2,它会正确显示我们案例中的小时:

14:35 
14:35 
14:35

所以它似乎是在读取我的令牌选项,但只是在=之后的第一个数字。我没有使用delim,因为输出只有空格,默认情况下读取为delims,我也可能在其名称中包含空格的文件,如上例所示。 此外,代码将保存在.bat文件中。

为什么它会忽略,*或*在令牌中的任何想法?

谢谢和问候,

尤利安

2 个答案:

答案 0 :(得分:2)

将令牌设置为3,*%%G将获得第三个令牌,%%H将获得*(其余行)。

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

  

<强> tokens=x,y,m-n

     

指定每次迭代时将每行中的哪些标记传递给for正文。

     

这将导致其他变量名称被分配。

     

m-n表单是一个范围,指定m - 通过n - 代币。

     

如果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

答案 1 :(得分: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
)