Войти

Показать полную графическую версию : Общий размер каталогов по списку в 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

Или может кто предложит другое решение?

alpap
08-12-2017, 13:57
если все пути в одной директории, достаточно:

@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 байта

alpap
08-12-2017, 15:47
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"

Iska
08-12-2017, 22:31
Длинновато, не нашел в 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