Показать полную графическую версию : Общий размер каталогов по списку в TXT
surgutfred
08-12-2017, 10:15
Добрый день.
Задача: по определенному признаку отбираю в TXT набор папок с путями( в принципе они все в одном каталоге).
\\Pc86\Cons_Base2\BASE\ARB \\Pc86\Cons_Base2\BASE\BCN \\Pc86\Cons_Base2\BASE\BDV
Папки (базы КонсультантПлюс) каждый день меняются в размере, мне периодически нужно уточнять сколько будет весить тот или иной набор баз.
Сначала решил с помощью утилиты DURUSE, там просто загонял в переменную одной строкой все пути и считал. Но напоролся на ограничение длины строки.
rem считываем список баз из spisok.txt в переменную dirs
set /p dirs=< spisok.txt
Diruse.exe /m %dirs% > size.txt
Вытащил список баз построчно, определил размер каждой. А как получить общий размер списка?
3642.63 16 TOTAL: \\PC86\CONS_BASE2\BASE\ARB
99.05 14 TOTAL: \\PC86\CONS_BASE2\BASE\BCN
86.97 14 TOTAL: \\PC86\CONS_BASE2\BASE\BDV
290.37 14 TOTAL: \\PC86\CONS_BASE2\BASE\BMS
174.95 14 TOTAL: \\PC86\CONS_BASE2\BASE\BPV
229.92 14 TOTAL: \\PC86\CONS_BASE2\BASE\BSK
Или может кто предложит другое решение?
если все пути в одной директории, достаточно:
@echo off
setlocal enabledelayedexpansion
set "d=C:\papka"
for /f "tokens=3" %%a in ('2^>nul dir /a-d/s/-c "%d%"') do set sz=!pps!& set pps=%%a
echo Размер папки - %sz% байт
pause
если суммировать надо по разным путям:
@echo off
set "cPath="C:\papka1" "C:\papka2" "C:\papka7""
for %%d in (%cPath%) do for /f "tokens=3" %%a in ('"2>nul dir /a-d/s/-c "%%~d"|sort /+2147483647|more +1|set /p sz=^& cmd /v/c echo !sz!"') do set /a csz+=%%a
echo General size: %csz%
pause
НО ОГРАНИЧЕНИЕ СТРОКИ И РАЗРЯДНОСТИ НИКУДА НЕ ДЕВАЕТСЯ!
подобные задачи лучше делать не на cmd или с применением спец. софта
surgutfred
08-12-2017, 14:15
alpap, спасибо за ответ но он мне не подходит, поскольку мне не нужен размер всех папок в директории. Мне нужен общий размер папок по списку заданному в текстовом файле, т.е определенному набору из имеющихся в данном каталоге. Наборы слишком вариативны, что бы их всех прописать заранее.
Для интереса натравил первый вариант на целевую папку общим весом 225гб, Ваш вариант выдал мне 193 байта
surgutfred,
вот со списком
@echo off
set "f=C:\spisok.txt"
for /f "usebackq delims=" %%p in ("%f%") do (
for /f "tokens=3" %%a in ('"2>nul dir /a-d/s/-c "%%p"|sort /+2147483647|more +1|set /p sz=^& cmd /v/c echo !sz!"') do set /a csz+=%%a
)
echo General size: %csz%
pause
...весом 225гб, Ваш вариант выдал мне 193 байта »
но я предупреждал - cmd такие цифры "не по зубам"
megaloman
08-12-2017, 16:12
surgutfred, BoxIn = "Z:\PC86\CONS_BASE2\BASE"
SubDir = Array("ARB", "BCN", "BDV", "BMS", "BPV", "BSK")
OutFile = "Z:\Box_Out\Обзор Консультант Плюс.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
nMaxSize = 16
nMaxFiles = 5
OutString = BoxIn + vbCrLf + vbCrLf
tSize = 0
tFiles = 0
For Each inFolder In SubDir
inName = BoxIn + "\" + inFolder
With FSO.GetFolder(inName)
inSize = .Size
inFiles = .Files.Count
End With
tSize = tSize + inSize
tFiles = tFiles + inFiles
OutString = OutString + IntFormat(inSize, nMaxSize) + IntFormat(inFiles, nMaxFiles) + " " + inFolder + vbCrLf
Next
OutString = OutString + String(nMaxSize + nMaxFiles, "-") + vbCrLf + IntFormat(tSize, nMaxSize) + IntFormat(tFiles, nMaxFiles)
With FSO.OpenTextFile(OutFile, 2, True)
.Write (OutString)
.Close
End With
MsgBox OutString
Function IntFormat(S, N)
SS = Replace(FormatNumber(S, 0), Chr(160), "'")
If N > Len(SS) Then SS = Right(Space(N) + SS, N)
IntFormat = SS
End FunctionСохраните код, например, в блокноте в файл с расширением .vbs в windows-кодировке. Результат выдаётся в байтах, так как Вы не писали, в каких единицах нужно. Я смутно помню Консультант Плюс, ИМХО, в папках с базами нет подпапок, но если в папках с базами существуют подпапки, то в этом варианте количество файлов будет подсчитано неверно.Если не хотите, чтобы на экран выдавалось сообщение, удалите строку
MsgBox OutString
Скорректировал благодоря подсказке IskaSet WArg = WScript.Arguments
If WArg.Count >= 3 Then
With WArg
OutFile = .Item(0)
BoxIn = .Item(1)
NSubDir = .Count-3
Redim SubDir(NSubDir)
For i = 0 To NSubDir
SubDir(i) = .Item(i+2)
Next
End With
Set FSO = CreateObject("Scripting.FileSystemObject")
nMaxSize = 16
nMaxFiles = 5
OutString = BoxIn + vbCrLf + vbCrLf
tSize = 0
tFiles = 0
For Each inFolder In SubDir
inName = BoxIn + "\" + inFolder
On Error Resume Next
Set SubFolder = FSO.GetFolder(inName)
If Err.Number <> 0 Then
OutString = OutString + "Нет папки" + Space(nMaxSize + nMaxFiles-9) + " " + inFolder + vbCrLf
Else
With SubFolder
inSize = .Size
inFiles = .Files.Count
End With
tSize = tSize + inSize
tFiles = tFiles + inFiles
OutString = OutString + IntFormat(inSize, nMaxSize) + IntFormat(inFiles, nMaxFiles) + " " + inFolder + vbCrLf
End If
On Error Goto 0
Next
OutString = OutString + String(nMaxSize + nMaxFiles, "-") + vbCrLf + IntFormat(tSize, nMaxSize) + IntFormat(tFiles, nMaxFiles)
With FSO.OpenTextFile(OutFile, 2, True)
.Write (OutString)
.Close
End With
MsgBox OutString
Else
ErrMess = ""
ErrMess = ErrMess + "Количество аргументов """ + CStr(WArg.Count) + """ недостаточно" + vbCrLf + vbCrLf
ErrMess = ErrMess + "Укажите:" + vbCrLf
ErrMess = ErrMess + "1. Путь к выходному текстовому файлу" + vbCrLf
ErrMess = ErrMess + "2. Путь к папке с подпапками баз" + vbCrLf
ErrMess = ErrMess + "3. Наименование 1 подпапки с базами" + vbCrLf
ErrMess = ErrMess + "4. Наименование 2 подпапки с базами" + vbCrLf
ErrMess = ErrMess + "... и т д"
MsgBox ErrMess
End If
Function IntFormat(S, N)
SS = Replace(FormatNumber(S, 0), Chr(160), "'")
If N > Len(SS) Then SS = Right(Space(N) + SS, N)
IntFormat = SS
End FunctionПример вызова (допустим, скрипт называется skript.vbs):Z:\script.vbs "Z:\Box_Out\Обзор Консультант Плюс.txt" "Z:\PC86\CONS_BASE2\BASE" ARB BCN BDV BMS BPV BSKЛибо можно написать батник в одну строчку, и, вместо того, чтобы рисовать текстовый файл spisok.txt для набора баз, можно сделать этот вызов для конкретного набора баз в однострочном бат-файле, например spisok.batCall Z:\script.vbs "Z:\Box_Out\Обзор Консультант Плюс.txt" "Z:\PC86\CONS_BASE2\BASE" ARB BCN BDV BMS BPV BSK
megaloman
08-12-2017, 22:15
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=Z:\PC86\CONS_BASE2\BASE"
Set "SubDir=ARB BCN BDV BMS BPV BSK"
Set "OutFile=Z:\Box_Out\Обзор Консультант Плюс.txt"
Pushd "%BoxIn%"
>"%OutFile%" (
Echo %BoxIn%
Echo:
FOR %%i IN (%SubDir%) DO (
Set "N1="
Set "N2="
FOR /F "usebackq tokens=* delims= " %%j IN (`Dir /S /A:-D "%%i"`) DO Set "N2=!N1!" & Set "N1=%%j"
Echo %%i !N2!
)
)
Popd
@Echo Off
If "%~3"=="" Cls &Echo Недостаточно аргументов &Pause &Exit /b 240
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=%~1"
Set "SubDir=%~2"
Set "OutFile=%~3"
Pushd "%BoxIn%"
>"%OutFile%" (
Echo %BoxIn%
Echo:
FOR %%i IN (%SubDir%) DO (
Set "N1="
Set "N2=Папка не найдена"
If Exist "%%i" FOR /F "usebackq tokens=* delims= " %%j IN (`Dir /S /A:-D "%%i" 2^>nul`) DO Set "N2=!N1!" & Set "N1=%%j"
Echo %%i !N2!
)
)
Popd
GoTo :Eof
Пример вызова (допустим, скрипт называется skript.bat):
script.bat "Z:\PC86\CONS_BASE2\BASE" "ARB BCN BDV BMS BPV BSK" "Z:\Box_Out\Обзор Консультант Плюс.txt"
Длинновато, не нашел в vbs функцию аналогичную Format в vba »
FormatNumber()?!
https://technet.microsoft.com/en-us/library/ee176975.aspx
http://download.microsoft.com/download/winscript56/Install/5.6/W982KMeXP/EN-US/scrdoc56en.exe
megaloman
10-12-2017, 11:56
Iska, Спасибо, исправил.
surgutfred, Добавил варианты с передачей данных в скрипты через аргументы.
surgutfred
11-12-2017, 08:31
Всем спасибо за участие.
Учитывая сложность работы cmd с большими объемами, для себя остановился на варианте vbs от megaloman
VBS с аргументами наиболее удачно подошел.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.