Вопрос № 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.... Но в таком случае жаловалось на ошибку. Заранее благодарен.
Отвечает Megaloman, Бакалавр :
Здравствуйте, Dimon4ik. Вот решение. Оно позволяет посчитать суммарный размер файлов по указанной в скрипте маске в папке и содержащихся в ней подпапках.
Код:
Set Argum = WScript.Arguments
If Argum.Count = 0 Then a = MsgBox("Скрипт запущен без аргументов") Else
'
Подсчёт суммарного размера файлов в директории и всех поддиректориях по маске ' Исходные данные
iiiDir = Argum(0) ' Директория
Maska = "^.*\.xls$" ' Маска файла
' ---------------------------------------------
Set FSO = CreateObject("Scripting.FileSystemObject")
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
Проверил, работает, по результатам совпадает с результатами команды 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) ' Подсчитываем файлы и их длину во всех поддиректориях
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
Ответ отправил: Megaloman, Бакалавр
Ответ отправлен: 24.12.2009, 12:18
Оценка ответа: 5 Комментарий к оценке: Большое Вам спасибо, уже много раз Вы меня выручаете с различного рода задачами! Отличный код, описание, а также спасибо за выложенные Вами файлы со скриптами!
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 258096
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.