Показать полную графическую версию : [решено] Определение размера папки
Fantastish
01-04-2016, 12:56
Доброго.
Подскажите, как реализовать задачу:
Требуется в списке компов (в текстовом файле (Формат: PC00T1 построчно)) на диске C:\ в папке ProgramData проверить наличие папки (например ТЕСТ) и определить размер папки, далее вывести в лог
[Имя ПК]-[Если папки нет, то записывает ее отсутствие]-[Размер папки в формате Мбайт]
Спасибо.
megaloman
02-04-2016, 09:38
Требуется в списке компов (в текстовом файле (Формат: PC00T1 построчно)) -понятнона диске C:\ в папке ProgramData проверить наличие папки (например ТЕСТ)C:\ProgramData\ТЕСТ - я правильно понял? А причём здесь список компов? На каждом локальном компьютере ищем папку? Или по сети имеем доступ к каждому компу (как расшарена папка?) Или в папке C:\ProgramData на каком-то одном компе (сервере?) должна быть папка, сопоставимая с именем компа из списка?
Foreigner
02-04-2016, 10:43
Размер папки узнать легко. На счет списка компьютеров, то на этот вопрос, без реального тестирования ответить не могу.
PowerShell:
$size = get-childitem "C:\ProgramData\ТЕСТ" -force -recurse | measure-object length -sum
'Size of C:\ProgramData\ТЕСТ is {0:0.00}Mb' -f ($size.sum / 1mb)
Батник (без проверки на 2147483647):
@echo off
setlocal
1>nul chcp 437
for /f "tokens=3" %%i in ('dir /s /-c C:\ProgramData\TECT ^| findstr "File(s)"') do set /a size=%%i/1048576
echo Size of C:\ProgramData\ТЕСТ is %size%Mb
1>nul chcp 866
megaloman
02-04-2016, 18:15
Foreigner, Я в полном восторге от того, что поиск "File(s)" в таком контексте годится для системы с русскоязычным интерфейсом.
Вот еще вариант без findstr@echo off
cls
Set "In=z:\ProgramData\rrr"
SetLocal EnableExtensions EnableDelayedExpansion
If Exist "%In%" (
for /f "usebackq tokens=3" %%i in (`dir /s /-c "%In%" 2^>nul`) do Set A=!B! & Set B=%%i
Set /A A=!A!/1048576
Echo !A!Mb in %In%
) Else (
Echo Not Exist %In%
)
Однако, при переводе байт в мегабайты по моему скромному мнению не совсем корректно в батнике отображать результат деления размера в байтах на 1048576 (то есть 1024^2) так как батник работает в целых числах и результат, например, 10.99 будет отображаться как 10.
Можно попытаться для корректности отображения применить такое выражение для перевода в мегабайты с десятичным округлением вместо имеющегося
Set /A A=^(^(!A!*10^)/1048576+5^)/10
greg zakharov
02-04-2016, 19:04
Если использовать robocopy, то переводить в Мб не нужно.
@echo off
setlocal
set "dir=%programfiles%\Test"
if not exist "%dir%" echo:Does not exist.&goto:eof
pushd "%dir%"
for /f "tokens=3,4" %%i in (
'robocopy . . * /l /s /v /r:1 /w:1 ^| findstr /irc:"bytes"'
) do echo:%dir%: %%i%%j
popd
endlocal
exit /b
Остальное можно легко подсторить под себя.
На счет PS... можно было бы короче:
'{0:f2}Mb' -f ((ls $env:programfiles\Test -r -for -ea 0 | measure length -sum).Sum / 1Mb)
Fantastish
06-04-2016, 09:46
Прошу прощения не мог ответить.
C:\ProgramData\ТЕСТ - я правильно понял? А причём здесь список компов? На каждом локальном компьютере ищем папку? Или по сети имеем доступ к каждому компу (как расшарена папка?) Или в папке C:\ProgramData на каком-то одном компе (сервере?) должна быть папка, сопоставимая с именем компа из списка? »
Данная папка приведена как пример, она присутствует на локальных компьютерах в сети и к ней есть доступ тока вида \\pc\c$\programdata\тест - естественно у группы администраторов
она присутствует на локальных компьютерах в сети и к ней есть доступ тока вида \\pc\c$\programdata\тест - естественно у группы администраторов »
У администраторов есть доступ к удалённой машине по Wbem, а не только по UNC. Кроме того, в случае PowerShell доступна ещё одна технология доступа.
Fantastish
06-04-2016, 13:29
процесс реализация (работы/механизма) скрипта в принципе не так критичен, чем проще тем проще
главное из списка машин собрать информацию, чтобы руками не проходить не искать
megaloman
07-04-2016, 10:51
@Echo off
cls
Set "Spis=Z:\Spis_Comp.txt"
Set "Logf=Z:\Logfile.txt"
Set "Shar=C$\ProgramData\Тест"
rem Set "Shar=C$\ProgramData\Application Data"
SetLocal EnableExtensions EnableDelayedExpansion
Del "%Logf%" 2>nul
FOR /F "usebackq delims=" %%c IN ("%Spis%") DO Call :ComPing "%%c"
GoTo :Eof
:ComPing
Ping -n 1 -w 1000 %~1 >nul 2>nul
If Not !ERRORLEVEL!==0 (
Echo ??? %1 Не в сети >>"%Logf%"
) Else (
Call :Dostup "\\%~1\%Shar%"
)
)
GoTo :Eof
:Dostup
Set "Share=%~1"
If Exist "%Share%\" (
Dir "%Share%\*.*" >nul 2>nul
If Not !ERRORLEVEL!==0 (
Echo --- Нет доступа %Share% >>"%Logf%"
) Else (
Call :SizeDir "%Share%"
)
) Else (
Echo --- Не существует %Share% >>"%Logf%"
)
GoTo :Eof
:SizeDir
for /f "usebackq tokens=3" %%i in (`dir /s /-c %1 2^>nul`) do Set A=!B! & Set B=%%i
rem Set /A A=!A!/1048576
Set /A A=^(^(!A!*10^)/1048576+5^)/10
Echo +++ !A!Mb в %1 >>"%Logf%"
GoTo :Eof
Fantastish
08-04-2016, 09:29
Спасибо, вопрос, а как может быть вот такое значение =) ( +++ -47Mb )
а как может быть вот такое значение ( +++ -47Mb ) »
Например, банальное переполнение:
C:\Мои проекты\0003>set /a 2^<^<29
1073741824
C:\Мои проекты\0003>set /a 2^<^<30
-2147483648
Толкование явления в: Дополнительный код (представление числа) — Википедия (https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0 %B4_(%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1% 81%D0%BB%D0%B0)).
Fantastish
08-04-2016, 12:13
понятно, то есть в ГБ идет уже счет
megaloman
08-04-2016, 18:53
Fantastish, Поэтому лучше не сводить в мегабайты, а брать значения как есть в Dir в байтах, а для читабельности выравнивать объем по правому краю и с пробелами между разрядами. Замените кусок предыдущего кода.:SizeDir
for /f "usebackq tokens=3,4*" %%i in (`dir /s %1 2^>nul`) do Set A=!B! & Set B=%%i %%j
Set "A= !A!"
Echo +++ !A:~-23! в %1 >>"%Logf%"
GoTo :Eof
Fantastish
11-04-2016, 09:36
Большое спасибо
Fantastish
11-04-2016, 12:29
Такс возникла еще непонят ка, после работы скрипта, получилось вот такое:
1я646я506я770 Ў*©в в
Fantastish, неправильная кодировка. Скриншот покажите.
megaloman
11-04-2016, 14:48
1. Если батник сделан в 866 кодировке, то и программа-просмотрщик полученного текстового файла должна позволять просматривать текст в 866 кодировке. Например, вьювер или встроенный редактор менеджера FAR.
В этом случае для немедленного просмотра результатов работы можно после первого FOR и перед первым GoTo вставить строку
type "%Logf%"
2. Если батник сделан в Windows-кодировке 1251, то добавьте в батник после cls строку
>nul chcp 1251
В этом случае для немедленного просмотра результатов работы можно после первого FOR и перед первым GoTo вставить строку
Notepad "%Logf%"
Fantastish
12-04-2016, 09:10
Спасибо.
Результат: +++ 1*665*816*255 байт
Тему можно закрывать, я так понимаю таким же образом можно и смотреть занятый объем на дисках, а можно ли обратно проверять наличие логических дисков и оставшееся свободное место?
Если это другой вопрос, то не критично, можно не продолжать обсуждение.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.