2015-07-03 38 views
0

如何統計文件夾和子文件夾文件中的文件。文件夾名稱和文件計數以及子文件夾名稱和文件計數。 例如:批處理文件來統計文件夾和子文件夾文件中的所有文件,並使用批處理文件在文件夾名稱中寫入輸出文件

test1 : 2 
test1\test11 :3 
newfolder : 5 
newfolder : 10 

這樣。

+0

總數可能重複? http://stackoverflow.com/questions/11004045/batch-file-counting-number-of-files-in-folder-and-storing-in-a-variable – Marged

回答

3
robocopy "x:\target\folder" "x:\target\folder" /l /nocopy /is /e /nfl /njh /njs 

pushd "x:\target\folder" && (
    robocopy . . /l /nocopy /is /e /nfl /njh /njs 
    popd 
) 

這就叫robocopy,但不是抄襲任何東西,我們會要求什麼都不會被複制,只有返回的應該怎樣處理(/nocopy /l)名單。我們請求從當前文件夾(使用前一個pushd命令)複製到當前文件夾,包括進程中的相同文件(/is),處理空的子文件夾(/e,包含具有0個文件的文件夾),但僅處理兩個級別(/lev:2當前文件夾和下面的一個),而不會產生一個文件列表(/nfl),無作業頭(/njh)和無工作摘要(/njs

其結果將是相同的列表,但與文件夾的名稱和更改列中的文件數

保持原始輸出格式

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "x:\target\folder" && (
     for /f "tokens=1,*" %%a in (' 
      robocopy . . /l /nocopy /is /e /nfl /njh /njs 
     ') do echo %%~fb : %%a 
     popd 
    ) 

這將使用一個for /f處理以前robocopy命令,分裂在兩個記號線,第一包含的文件的數量和將存儲在%%a,並且所述第二線的其餘部分,將是存儲在%%b。對於內部robocopy命令的輸出中的每一行,將執行do子句中的代碼:僅回顯以按相反順序控制這兩個標記。

如果robocopy不能使用(OS比Vista以上),然後

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /d /r "x:\target\folder" %%a in (*) do for /f "tokens=1,5" %%b in (' 
     dir /a-d "%%~fa.\*" 2^> nul ^| findstr /b /c:" " ^|^| echo 0 
    ') do if "%%c"=="" echo %%~fa : %%b 

這將

  • 對於啓動目錄(for /r /d)下的每個文件夾搶參考並將其存儲在%%a可替換參數
  • 使用文件夾的完整路徑運行dir命令%%~fa
  • 使用管道(|)來過濾列表,只檢索有兩個空格(頁腳行)
  • 如果沒有發現線啓動線(也就是dir命令失敗)輸出0
  • 使用for /f命令處理由dir | findstr生成的行。我們將讀取第一個標記(正確行中的文件數)和第五個(僅存在於具有目錄信息的頁腳行中)
  • 如果第五個元素爲空,則此行包含有關文件的信息,而不是該文件夾,因此,回聲文件夾路徑和裏面
  • 文件結尾處,恢復以前的Active Directory

這種方法的問題是,dir | findstr爲每個子文件夾執行。這會使得這個解決方案比robocopy慢。

它可以更快,但需要

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "root=%cd%" 

    set "folder=" 
    for %%r in ("%root%") do (
     set "rootDrive=%%~dr\" 
     if not defined rootDrive set "rootDrive=\\" 
     for /f "delims=" %%a in (' 
      dir /s /a "%%~fr.\*" 2^>nul ^| findstr /r /c:"^ " /c:"^ .*\\." 
     ') do for /f "tokens=1,* delims=\" %%b in ("%%~a") do if not "%%c"=="" (
      set "folder=%%c" 
     ) else if defined folder (
      for /f %%d in ("%%~a") do (
       setlocal enabledelayedexpansion 
       echo(!rootDrive!!folder! : %%d 
       endlocal 
      ) 
      set "folder=" 
     ) 
    ) 

更多的代碼,在這種情況下,我們將只執行一個dir命令檢索的完整列表,並與findstr過濾列表,以僅檢索與該線文件夾的名稱和每個文件夾的頁腳。

代碼將在此列表上迭代(for /f %%a)。當找到一個文件夾行(它包含一個反斜槓並可以被for /f %%b分割)時,文件夾名稱將保存在一個變量中。當相應的頁腳行被採納(它沒有被反斜槓分割)時,該行被分割以獲得文件的數量(for /f %%d),並且文件夾名稱和文件數被回顯給控制檯(這裏需要延遲擴展檢索變量的內容,因爲他們設定相同的循環)

注意內:使用for /f來處理由執行命令產生的數據的大名單可真慢(存在怎樣的不良行爲命令處理內存)。對於這種情況,有必要首先執行生成數據的命令(在這種情況下爲dir | findstr),將其輸出發送到文件,然後使用for /f來處理文件。

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "root=%~1" 
    if not defined root for %%a in (.) do set "root=%%~fa" 

    set "folder=" 
    for %%t in ("%temp%\%~nx0.%random%%random%.tmp") do for %%r in ("%root%") do (

     set "rootDrive=%%~dr\" 
     if not defined rootDrive set "rootDrive=\\" 

     (dir /s /a "%%~fr.\*" 2^> nul | findstr /r /c:"^ " /c:"^ .*\\.") > "%%~ft" 

     for /f "usebackq delims=" %%a in ("%%~ft") do (
      for /f "tokens=1,* delims=\" %%b in ("%%~a") do if not "%%c"=="" (
       set "folder=%%c" 
      ) else if defined folder (
       for /f %%d in ("%%~a") do (
        setlocal enabledelayedexpansion 
        echo(!rootDrive!!folder! : %%d 
        endlocal 
       ) 
       set "folder=" 
      ) 
     ) 

     del /q "%%~ft" 
    ) 

編輯適應評論:robocopy解決方案更改爲包含文件

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "total=0" 
    pushd "x:\target\folder" && (
     for /f "tokens=1,*" %%a in (' 
      robocopy . . /l /nocopy /is /e /nfl /njh /njs 
     ') do (
      echo %%~fb : %%a 
      set /a "total+=%%a" 
     ) 
     popd 
    ) 
    echo Total files: %total% 
+0

@echo off setlocal enableextensions disabledelayedexpansion pushd「x :\ target \ folder「&&( for/f」tokens = 1,*「%% a in(' robocopy。。/ l/nocopy/is/e/nfl/njh/njs ')do echo %% 〜fb:%% a popd )這工作正常,但我也需要總文件數。請建議我..謝謝 –

+0

@VittalCherala,最簡單的方法就是彙總文件。答案已更新。但是這隻有在你的文件少於2147483648(批量算術限制)時纔有效。這是你的問題嗎? –

相關問題