Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Vasiliy83
Статус: Практикант
Рейтинг: 971
∙ повысить рейтинг »
Ashotn
Статус: Студент
Рейтинг: 920
∙ повысить рейтинг »
Megaloman
Статус: Бакалавр
Рейтинг: 853
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Basic/VBA

Номер выпуска:967
Дата выхода:29.12.2009, 09:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:370 / 100
Вопросов / ответов:1 / 1

Вопрос № 175580: Здравствуйте Уважаемые эксперты. Помогите, пожалуйста, написать vbs скрипт. Который бы выводил размер всех файлов указного расширения на указанном диске в окне. Вот до чего я дошел:


Вопрос № 175580:

Здравствуйте Уважаемые эксперты. Помогите, пожалуйста, написать vbs скрипт.
Который бы выводил размер всех файлов указного расширения на указанном диске в окне.
Вот до чего я дошел:

Код:
Set objArgs = WScript.Arguments
call ShowDriveInfo(objArgs(0))

Sub ShowDriveInfo(drvPath)
Dim fso, drv, s, fil,f1,f
Set fso = CreateObject("Scripting.FileSystemObject")
Set drv = fso.GetDrive(fso.GetDriveName(drvPath))
Set f = fso.GetFolder(objArgs(0))
Set fc = f.SubFolders
For Each f1 in fc
s = s & f1.size
s = s & f1.name
s = s & VbCrLf
Next
msgbox s
End Sub

Но дело в том, что как сложить все эти размеры, и как именно указанный тип выбрать и все это мне остается не понятно.
Я думал что н ужно как то с оператором like. Например: if "ObjArgs(1)" like f1.name Then....
Но в таком случае жаловалось на ошибку.
Заранее благодарен.

Отправлен: 24.12.2009, 00:16
Вопрос задал: Dimon4ik, 5-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Megaloman, Бакалавр :
Здравствуйте, Dimon4ik. Вот решение. Оно позволяет посчитать суммарный размер файлов по указанной в скрипте маске в папке и содержащихся в ней подпапках.
Код:

Set Argum = WScript.Arguments

If Argum.Count = 0 Then
a = MsgBox("Скрипт запущен без аргументов")
Else

' Подсчёт суммарного размера файлов в директории и всех поддиректориях по маске
' Исходные данные

iiiDir = Argum(0) ' Директория

Maska = "^.*\.xls$" ' Маска файла

' ---------------------------------------------

Set FSO = CreateObject("Scripting.FileSystemObject")

nFiles=0
Mess = SizeFilesDir(iiiDir, Maska)

Call AllFolders(iiiDir, Maska)

a = MsgB ox("Директория: " + iiiDir + vbCrLf + "Маска: " + Maska + vbCrLf + "Суммарный размер файлов: " + CStr(Mess) + vbCrLf + "Количество файлов: " + CStr(nFiles))

End If


Sub AllFolders(inDir, inMaska) ' ---------------------------------------------
' Wscript.Echo inDir
Set F = FSO.GetFolder(inDir)
Set SubF = F.SubFolders

For Each Folder In SubF
' Wscript.Echo Folder.Name
Mess = Mess + SizeFilesDir(inDir + "\" + Folder.Name, inMaska)
Call AllFolders(inDir + "\" + Folder.Name, inMaska)

Next

End Sub


Function SizeFilesDir(iDir, iMaska) ' ---------------------------------------------
' Подсчет длины файлов в директории по маске
' iDir - ' Имя директории (без \ н а конце)
' iMaska - ' Маска файлов (например "*.exe")

iSize = 0

Set Tdir = FSO.GetFolder(iDir)
Set AllFiles = Tdir.Files

' Set RE = CreateObject("VBscript.RegExp") ' Так Тоже можно
Set Re = New RegExp

Re.Pattern = iMaska
Re.MultiLine = False
Re.Global = True
Re.IgnoreCase = True

For Each iFile In AllFiles
If Re.Test(iFile.Name) Then
iSize=iSize+iFile.Size
nFiles=nFiles+1
End If
Next

SizeFilesDir = iSize

End Function

Сохраните код в файл с расширением .vbs в Windows-кодировке, например SumSizeFile.vbs
Запускайте его с аргументом, например:

SumSizeFile.vbs "F:\"
SumSizeFile.vbs "C:\Program Files\"

Проверил, работает, по результатам совпадает с результатами команды Dir

Скрипт можно взять в прикрепл ённом файле. Только переименуйте его в правильное расширение.

Вот код позволяющий вводить имя директории и расширение, например
SumSizeFile.vbs "D:\" "XLS"
В предыдущем скрипте может возникнуть проблема при работе, когда в указанной папке есть подпапка, для которой у Вас нет доступа, например "System Volume Information"
В приведенном коде это учтено. Можно взять его SumSizeFile.vbs (4.1 кб)
Код:
' ---------------------------------------------------------------------------
' Скрипт подсчитывает суммарный размер файлов по маске в папке и подпапках
' Вызов скрипта, например:
' SumSizeFile.vbs "F:\" ; "XLS"
' SumSizeFile.vbs "C:\Program Files" "Exe"
' При наличии проб елов аргумент обязательно взять в кавычки
' ---------------------------------------------------------------------------

Set Argum = WScript.Arguments

If Argum.Count <2 Then ' Если при вызове скрипта кол-во аргументов <2 ничего не делаем
a = MsgBox("Скрипт запущен без аргументов")
Else

iiiDir = Argum(0) ' Директория (берём из аргумента)

Maska = "^.*\." + Argum(1) + "$" ' Формируем строку для регулярного выражение для маски файла (из аргумента)

' ---------------------------------------------

Set FSO = CreateObject("Scripting.FileSystemObject") ' Создаём объект для доступа к файловой системе

nFiles=0 ' Начальное значение кол-ва файлов
Mess = SizeFilesDir(iiiDir, Maska)
' Подсчитываем файлы и их длину в корне указанной директории
Call AllFolders(iiiDir, Maska) ' Подсчитываем файлы и их длину во всех поддиректориях

a = MsgBox("Директория: " + iiiDir + vbCrLf + "Маска: " + Maska + vbCrLf + "Суммарный размер файлов: " + CStr(Mess) + vbCrLf + "Количество файлов: " + CStr(nFiles))

End If


Sub AllFolders(inDir, inMaska) ' ---------------------------------------------
' Процедура рекурентно подсчитывает файлы и их длину в директории и поддиректориях
' inDir - путь директории
' inMaska - регулярное выражение с маской файлов
' Wscript.Echo inDir

On Error Resume Next ' Обработаем ситуацию, если встретилась директория без доступа
Set F = FSO.GetFolder(inDir) ' Создаём объект для доступа к директории
If Err.Number = 0 Then
Set SubF = F.SubFolders ' Создаём коллекцию поддиректорий в указ директории

For Each Folder In SubF ' Просматриваем каждый элемент коллекции (все директории)
' Wscript.Echo Folder.Name
Mess = Mess + SizeFilesDir(inDir + "\" + Folder.Name, inMaska) ' Насуммируем число файлов и их длину
Call AllFolders(inDir + "\" + Folder.Name, inMaska) ' Рекурентно Просматриваем каждый элемент коллекции (все директории)

Next

End If

End Sub


Function SizeFilesDir(iDir, iMaska) ' ---------------------------------------------
' Подсчет длины файлов в директории по маске
' iDir - ' Имя директории (без \ на конце)
' iMaska - ' Маска файлов (например "*.exe")

i Size = 0

On Error Resume Next ' Обработаем ситуацию, если встретилась директория без доступа

Set Tdir = FSO.GetFolder(iDir) ' Создаём объект для доступа к текущей директории
If Err.Number = 0 Then

Set AllFiles = Tdir.Files ' Для текущей директории создаём коллекцию файлов

' Set RE = CreateObject("VBscript.RegExp") ' Так Тоже можно

Set Re = New RegExp ' Создаём экземпляр регулярного выражения

Re.Pattern = iMaska ' Задаём маску
Re.MultiLine = False ' Текст однострочный
Re.Global = True ' будем проходить всю строку
Re.IgnoreCase = True ' игнорируем регистр символов

For Each iFile In AllFiles ' Просматриваем файлы в директории
If Re. Test(iFile.Name) Then ' Проверяем имя файла на соответствие рег выражению
iSize=iSize+iFile.Size ' Насуммируем размеры файлов
nFiles=nFiles+1 ' Насуммируем кол-во файлов
End If
Next

End If

SizeFilesDir = iSize

End Function

В дополнение к ответу приведу решение с помощью командного файла. Решение основано на том, что суммарная информация по файлам содержится в предпоследней строке выдачи команды Dir
Код:
echo off
rem ----------------------------------------------------------------
rem В аргументе при вызове путь и имя файла или маска файла
rem Например (если в имени или пути есть пробел, обязательны кавычки
rem SumSizeFile.bat "C:\Program Files\*.xls"
rem SumSizeFile.bat C:\*.xls
rem -------------------------- --------------------------------------

if "%1"=="" GoTo WithOut

Set ComDir=dir /s %1

Set S1=''
Set S2=''

For /F "usebackq delims==" %%a In (`%ComDir%`) Do Call :Stroka2 "%%a"

Call :Rezult %1 %S2%

GoTo End

rem ----------------------------------------------------------------
:Stroka2

Set S2=%S1%
Set S1=%1

GoTo End

rem ----------------------------------------------------------------
:Rezult
Echo ---------------------------------------------------------------
Echo %~1
Echo %~2
Echo ---------------------------------------------------------------
pause
GoTo End

:WithOut
Echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Echo Не указан аргумент командного файла
Echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pause

:End

Прикрепленный файл: загрузить »

-----
Нет времени на медленные танцы

Ответ отправил: Megaloman, Бакалавр
Ответ отправлен: 24.12.2009, 12:18

Оценка ответа: 5
Комментарий к оценке:
Большое Вам спасибо, уже много раз Вы меня выручаете с различного рода задачами!
Отличный код, описание, а также спасибо за выложенные Вами файлы со скриптами!

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 258096 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.13 от 28.12.2009

    В избранное