Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Общий размер каталогов по списку в TXT

Ответить
Настройки темы
CMD/BAT - Общий размер каталогов по списку в TXT

Пользователь


Сообщения: 52
Благодарности: 1

Профиль | Отправить PM | Цитировать


Добрый день.
Задача: по определенному признаку отбираю в 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
Или может кто предложит другое решение?

Отправлено: 10:15, 08-12-2017

 

Ветеран


Сообщения: 553
Благодарности: 154

Профиль | Отправить PM | Цитировать


если все пути в одной директории, достаточно:
Код: Выделить весь код
@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 или с применением спец. софта

Последний раз редактировалось alpap, 08-12-2017 в 14:14.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:57, 08-12-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 52
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:15, 08-12-2017 | #3


Ветеран


Сообщения: 553
Благодарности: 154

Профиль | Отправить PM | Цитировать


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 такие цифры "не по зубам"
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:47, 08-12-2017 | #4


Ветеран


Contributor


Сообщения: 1056
Благодарности: 600

Профиль | Отправить PM | Цитировать


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, 10-12-2017 в 11:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:12, 08-12-2017 | #5


Ветеран


Contributor


Сообщения: 1056
Благодарности: 600

Профиль | Отправить PM | Цитировать


Вот 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"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 10-12-2017 в 11:36.


Отправлено: 22:15, 08-12-2017 | #6


Ветеран


Contributor


Сообщения: 21518
Благодарности: 6155

Профиль | Отправить PM | Цитировать


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

https://technet.microsoft.com/en-us/.../ee176975.aspx
http://download.microsoft.com/downlo...scrdoc56en.exe
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:31, 08-12-2017 | #7


Ветеран


Contributor


Сообщения: 1056
Благодарности: 600

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 11:56, 10-12-2017 | #8


Пользователь


Сообщения: 52
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:31, 11-12-2017 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Общий размер каталогов по списку в TXT

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск файлов в поддиректориях по списку из txt и перемещение Sub-Zero Скриптовые языки администрирования Windows 15 27-03-2017 12:58
CMD/BAT - [решено] Выборка и txt по списку в txt файле cyberp1983 Скриптовые языки администрирования Windows 4 22-06-2016 00:18
CMD/BAT - [решено] Поиск папок в поддиректории по списку из txt и перемещение cyberp1983 Скриптовые языки администрирования Windows 7 17-04-2016 18:02
MySQL - [решено] команда создания конфигурации по списку дисков в файле disk.txt - неработает Damirt Программирование и базы данных 3 05-03-2013 18:42
CMD/BAT - [решено] перемещение каталогов по списку neprotiv Скриптовые языки администрирования Windows 4 02-03-2010 09:39




 
Переход