2015-04-16 67 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