我在一个简单的批处理命令中遇到了问题,我无法理解为什么“令牌”选项不能正常工作。我想要做的是在批处理文件中使用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文件中。
为什么它会忽略,*或*在令牌中的任何想法?
谢谢和问候,
尤利安
答案 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
)