Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Общий размер каталогов по списку в TXT (http://forum.oszone.net/showthread.php?t=331752)

surgutfred 08-12-2017 10:15 2783151

Общий размер каталогов по списку в TXT
 
Добрый день.
Задача: по определенному признаку отбираю в 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 2783184

если все пути в одной директории, достаточно:
Код:

@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 2783189

alpap, спасибо за ответ но он мне не подходит, поскольку мне не нужен размер всех папок в директории. Мне нужен общий размер папок по списку заданному в текстовом файле, т.е определенному набору из имеющихся в данном каталоге. Наборы слишком вариативны, что бы их всех прописать заранее.

Для интереса натравил первый вариант на целевую папку общим весом 225гб, Ваш вариант выдал мне 193 байта

alpap 08-12-2017 15:47 2783206

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

Цитата:

Цитата surgutfred
...весом 225гб, Ваш вариант выдал мне 193 байта »

но я предупреждал - cmd такие цифры "не по зубам"

megaloman 08-12-2017 16:12 2783209

surgutfred,
Попробуйте натравить мой .vbs-скрипт. Пропишите свой сетевой путь. Я не проверял на таком пути, по идее, должно работать. Пропишите путь создаваемого текстового файла
Код:

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
Скорректировал благодоря подсказке Iska
То же самое, данные передаются в аргументах
Код:

Set 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.bat
Код:

Call Z:\script.vbs "Z:\Box_Out\Обзор Консультант Плюс.txt" "Z:\PC86\CONS_BASE2\BASE" ARB BCN BDV BMS BPV BSK

megaloman 08-12-2017 22:15 2783264

Вот CMD. Подсчет размера папок без посторонних утилит. Общий размер папок при больших размерах в рамках CMD сделать наверное можно, но трудоёмко
Код:

@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 2783267

Цитата:

Цитата megaloman
Длинновато, не нашел в vbs функцию аналогичную Format в vba »

FormatNumber()?!

https://technet.microsoft.com/en-us/.../ee176975.aspx
http://download.microsoft.com/downlo...scrdoc56en.exe

megaloman 10-12-2017 11:56 2783444

Iska, Спасибо, исправил.
surgutfred, Добавил варианты с передачей данных в скрипты через аргументы.

surgutfred 11-12-2017 08:31 2783592

Всем спасибо за участие.
Учитывая сложность работы cmd с большими объемами, для себя остановился на варианте vbs от megaloman
VBS с аргументами наиболее удачно подошел.


Время: 11:17.

Время: 11:17.
© OSzone.net 2001-