2016-02-19 3 views
2

Итак, я собираюсь подсчитать файлы в каталоге, включая все подпапки, и получить результат как количество файлов, найденных в каталоге. Проблема в том, что я хочу исключить все папки с именем error. Те файлы в этой папке, которые я не хочу подсчитывать.Batch подсчитывает все файлы, но исключает их в определенной папке

Просто ...

for /r "\\server\share\folderA" %%G in (*.*) do (
set /A count=count + 1 
)  
echo %count% 

Под folderA есть много подпапок, что я рассчитываю, но и «ошибка» папки, которые я не хочу, чтобы сосчитать.

Так что я пытаюсь следующий ...

Создать временный файл с именем exclude.txt и введите error в этот файл

if not exist "c:\temp" mkdir "c:\temp" 2>nul 
if not exist c:\temp\exclude mkdir c:\temp\exclude 2>nul 
echo error> %excludefolder%\exclude.txt 

Теперь я хочу, чтобы совместить это каким-то образом. В основном делайте что-то вроде этого ...

for /r "\\server\share\folderA" %%G in (*.*) EXCLUDE: c:\temp\exclude\exclude.txt do (
set /A count=count + 1 
)  

Но я знаю, что это не сработает, и я не уверен, как это работает. Кто-нибудь знает? Благодаря!

ответ

3

Используйте DIR /S /B /A-D итерируйте все файлы. Выход включает полный путь к каждому файлу.

Труба, которая соответствует FINDSTR /L /I /V "\\error\\, чтобы отфильтровать пути, которые содержат \error\. Это также исключает любые папки в папке error. Поиск может быть изменен, чтобы исключить только «ошибку», но включить дочерние элементы «error».

Труба, которая соответствует FIND /C /V "", чтобы подсчитать количество файлов (линий).

dir /s /b /a-d | findstr /liv "\\error\\" | find /c /v "" 

Вышеуказанное будет просто отображать счет.

Если вы хотите захватить счетчик в переменной, используйте FOR/F для анализа вывода указанной выше команды. Необязательные символы яда, такие как |, должны быть экранированы при использовании в FOR/F.

@echo off 
for /f %%N in ('dir /s /b /a-d^|findstr /liv "\\error\\"^|find /c /v ""') do set count=%%N 
echo count=%count% 
+0

Спасибо за отличный ответ @dbenham. Кажется, это делает работу. Только для записи, могу ли я исключить больше папок с помощью этой настройки? Например, если бы я мог добавить '' \\ error \\ "" \\ другую папку \\ "' после '/ liv'? – MadsTheMan

+1

@MadsTheMan - Почти так. Вы должны поместить все папки исключений в одну строку, помеченные пробелами: 'findstr/liv \\ \\ \\ \\ anotherFolder \\" '. Если имя папки содержит пробелы, вам понадобится несколько опций \ C: string: 'findstr/iv/c:" \\ error \\ "/ c:" \\ другая папка \\ "'. Прочтите встроенную справку, используя 'help findstr' или' findstr /? '. Кроме того, вам может быть интересно узнать о недокументированных функциях по адресу http://stackoverflow.com/q/8844868/1012053 – dbenham

+0

Спасибо за ввод, просто отлично. И эта ссылка - золотая ценность. – MadsTheMan

2

Вы можете исключить из подсчета папку, содержащую «ошибку» строка:

@echo off 
set count=0 

for /r "\\server\share\folderA" %%a in (*.*) do (
    echo %%~pa | find /i "error" || set /A count+=1 
)  
echo %count% 

Это хороший способ, если вы уверены, что вы просто ONEпапку Error. Если у вас есть другая папка, содержащая строку «error», она также будет исключена из count.

+0

Благодарим за ввод. Работал как шарм на небольших папках, но когда я попробовал его в папке с файлами 10k +, он пошел очень медленно. Я не знаю, почему, но я кое-что узнал. Опять же, спасибо! – MadsTheMan

+2

Этот метод медленный, потому что: ** 1. ** Он использует трубу, которая требует запуска _two copy_ of 'cmd.exe' (файл размера 400 КБ), по одному для каждой стороны канала. ** 2. ** Кроме того, он запускает файл 'find.exe', размер файла 16 КБ. И основная причина: ** 3. ** Он выполняет предыдущие шаги _one time для каждого имени файла_!Более быстрый подход состоял бы в том, чтобы проверить, содержит ли имя поисковое слово, используя только внутренние команды: 'set 'name = %% ~ Pa" & if "! Name: error =!" equ "%% ~ Pa" set/A count + = 1'. Если вы хотите протестировать этот метод, не забудьте включить строку 'setlocal EnableDelayedExpansion' в начале программы. – Aacini

+0

@aacini Спасибо за объяснение, мне это нужно. Я собираюсь проверить это и посмотреть, как это работает. :) – MadsTheMan

Смежные вопросы