2012-08-12 54 views
2

我在一個文件夾中有一堆文件,它們的名字像a1.txt,a6.txt,a8.txt,..我需要數它們我試過這個批處理文件,但它不認可*作爲一種方法來解決所有數字,並不會返回正確的答案。使用批處理來計算文件夾中特定文件的數量

set /a count=0 
for /F "tokens=* delims= " %%i in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a.*"') do (set /a count=count+1) 

你能看到我做錯了嗎?感謝您的幫助提前。

+1

[批處理文件的可能的複製 - 計數數文件夾和存儲在變量](http://stackoverflow.com/questions/11004045/batch-file-counting-number-of-files-in-folder-and-storing-in-a-variable) – 2016-11-29 09:43:34

回答

1

面對類似的問題,我更願意使用我從Raymond Chen那裏學到的技巧,那就是use find as a replacement for wc -l

因此,以下scrit將批處理變量count設置爲匹配patttern的文件數。就像你的原始腳本一樣,目錄也被排除在外。

@echo off 

setlocal 

set count=0 
set pattern=a?.txt 

use dir /b %pattern% ^| find /c /v "" 

for /f %%i in ('dir /b /a-d %pattern_you_are_looking_for% ^| find /c /v ""') do @call set count=%%i 

echo %count% 

endlocal 
+0

謝謝我很感激,它適用於我有像a1.txt這樣的文件的情況,但是當我對文件進行同樣的操作時也是如此t的名字來源於一個文本文件,並使用與set pattern = file。%% a%。?。txt相同的格式,並且它不能用「?」替換數字。我檢查了回聲「%% a,它可以從我的文本文件正確識別,例如它給出file.abc.?.txt而不是file.abc.1.txt – user1594078 2012-08-13 16:38:24

+0

更新您的問題的細節,我們會請參閱[for循環中的延遲擴展](http://www.robvanderwoude.com/variableexpansion.php)。 – ixe013 2012-08-16 13:27:43

1

你做錯了什麼是所有以a開頭的文件的通配符。

您使用dir a.*並期待它來查找文件,就像a6.txt

而且,用空格來處理文件名,建議你刪除的分隔符。

set /a count=0 
for /F "delims=" %%i in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a*"') do (set /a count=count+1) 

(也聽其他的答案使你的代碼更有效的條款。)

+0

這可以很好地工作, – madprops 2016-09-05 23:49:42

1

你在錯誤的地方你的星號。我想你打算a*.txt。但是,這將匹配任何名稱以「a」開頭的文本文件。它不會將結果限制爲以「a」開頭的文本文件,然後是數字。

您可以將您的DIR命令的結果傳遞給FINDSTR,並使用正則表達式更具體。 FINDSTR正則表達式的支持是原始的,但它經常完成工作。

我假設你想要匹配諸如「a1.txt」,「a143.txt」之類的名稱,但是你不想匹配諸如「a1b.txt」或「aba1.txt」之類的文件。如果我得到了錯誤,那麼你需要改變正則表達式以符合你的要求。

此正則表達式\\a[0-9][0-9]*\.txt$的工作原理如下:

  • \\是一個轉義反斜槓,文件名前的最後一個反斜槓匹配
  • a比賽本身當然
  • [0-9]單個數字匹配(必有至少爲1)
  • [0-9]*匹配0或更多的附加數字
  • \.txt$轉義點並匹配「.txt」擴展名。 $匹配字符串的結尾 - 如果有其他字符,它將不匹配。

最後要做的事情是將FINDSTR的結果傳送給FIND,讓它爲您計算文件的數量。 FIND /C /V ""與任何行匹配,並且/ C選項提供匹配行的計數。它比遞增循環中的計數器更高效。

@echo off 
setlocal 
set /a count=0 
for /F %%N in ('dir/s/b/a-d "C:\Users\xyz\desktop\Project\a*.txt"^|findstr /ric:"\\a[0-9][0-9]*\.txt$"^|find /c /v ""') do set count=%%N 
echo count=%count% 
0

這裏有一個狡猾的方式一點點地數:

for /f "tokens=1 usebackq" %a in (`dir a* ^| find ^"File^(s^)^"`) do set count=%a 

這可以通過命令行來完成 - 改變雙重%爲批處理文件

有很多轉義(使用^)停止將下列字符解釋爲批處理文件的一部分,而不是傳遞到命令行

comman d執行是dir a* | find "File(s)",但|()"往往有特殊的含義

0
@SetLocal enabledelayedexpansion 
@for /F "tokens=1" %%a IN ('Dir "..\*.txt" /-C/S/A:-D') Do @Set number_of_files=!n2! & Set n2=%%a 
@echo %number_of_files% 
2

你可以在單行做到這一點

dir /a-d "C:\Users\xyz\desktop\Project\a.*" | find /C "/" 
+0

偉大的解決方案人;) – bArraxas 2018-01-10 12:54:06

相關問題