【问题标题】:Batch tokens issue批量令牌问题
【发布时间】:2015-04-16 07:11:55
【问题描述】:

我在一个简单的批处理命令中遇到了问题,我不明白为什么“令牌”选项不能正常工作。我要做的是在批处理文件中使用 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,因为输出只有空间,默认情况下被读取为 delim,而且我也可能有文件名中带有空格的文件,如上面的示例所示。 此外,代码将保存在 .bat 文件中。

知道为什么它会忽略标记中的 ,* 或 * 吗?

感谢和问候,

尤利安

【问题讨论】:

  • find "pdf" will find pdf, but not PDF. You should use the /iparameter. Anyway: why do you use find "pdf"` 而不仅仅是dir *.pdf?
  • 这确实是一个更短的方法,谢谢斯蒂芬!
  • Stephan,实际上 dir *.pdf 将传递给输出,该输出将被重定向到 a 文件,即我不需要的行。示例:驱动器 C 是 Windows 编号是 8E72-826A C:\Users\%userprofile%\Desktop 和底部的磁盘空间信息:879.104 字节 123.234.299.904 字节空闲
  • 是的,这是一个很好的理由。

标签: batch-file token


【解决方案1】:

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

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

tokens=x,y,m-n

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

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

m-n 形式是一个范围,指定 m-th 到 n-th 标记。

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

【讨论】:

    【解决方案2】:

    这将独立于本地化工作:

    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
    )
    

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2011-11-07
      • 1970-01-01
      • 2011-09-28
      • 2021-11-17
      相关资源
      最近更新 更多