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

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

Fantastish 01-04-2016 12:56 2622026

Определение размера папки
 
Доброго.
Подскажите, как реализовать задачу:
Требуется в списке компов (в текстовом файле (Формат: PC00T1 построчно)) на диске C:\ в папке ProgramData проверить наличие папки (например ТЕСТ) и определить размер папки, далее вывести в лог
[Имя ПК]-[Если папки нет, то записывает ее отсутствие]-[Размер папки в формате Мбайт]
Спасибо.

megaloman 02-04-2016 09:38 2622304

Цитата:

Цитата Fantastish
Требуется в списке компов (в текстовом файле (Формат: PC00T1 построчно))

-понятно
Цитата:

Цитата Fantastish
на диске C:\ в папке ProgramData проверить наличие папки (например ТЕСТ)

C:\ProgramData\ТЕСТ - я правильно понял? А причём здесь список компов? На каждом локальном компьютере ищем папку? Или по сети имеем доступ к каждому компу (как расшарена папка?) Или в папке C:\ProgramData на каком-то одном компе (сервере?) должна быть папка, сопоставимая с именем компа из списка?

Foreigner 02-04-2016 10:43 2622316

Размер папки узнать легко. На счет списка компьютеров, то на этот вопрос, без реального тестирования ответить не могу.
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 2622449

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 2622459

Если использовать 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 2623550

Прошу прощения не мог ответить.

Цитата:

Цитата megaloman
C:\ProgramData\ТЕСТ - я правильно понял? А причём здесь список компов? На каждом локальном компьютере ищем папку? Или по сети имеем доступ к каждому компу (как расшарена папка?) Или в папке C:\ProgramData на каком-то одном компе (сервере?) должна быть папка, сопоставимая с именем компа из списка? »

Данная папка приведена как пример, она присутствует на локальных компьютерах в сети и к ней есть доступ тока вида \\pc\c$\programdata\тест - естественно у группы администраторов

Iska 06-04-2016 11:00 2623588

Цитата:

Цитата Fantastish
она присутствует на локальных компьютерах в сети и к ней есть доступ тока вида \\pc\c$\programdata\тест - естественно у группы администраторов »

У администраторов есть доступ к удалённой машине по Wbem, а не только по UNC. Кроме того, в случае PowerShell доступна ещё одна технология доступа.

Fantastish 06-04-2016 13:29 2623632

процесс реализация (работы/механизма) скрипта в принципе не так критичен, чем проще тем проще
главное из списка машин собрать информацию, чтобы руками не проходить не искать

megaloman 07-04-2016 10:51 2623865

Код:

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

Спасибо, вопрос, а как может быть вот такое значение =) ( +++ -47Mb )

Iska 08-04-2016 10:12 2624263

Цитата:

Цитата Fantastish
а как может быть вот такое значение ( +++ -47Mb ) »

Например, банальное переполнение:
Код:

C:\Мои проекты\0003>set /a 2^<^<29
1073741824
C:\Мои проекты\0003>set /a 2^<^<30
-2147483648

Толкование явления в: Дополнительный код (представление числа) — Википедия.

Fantastish 08-04-2016 12:13 2624330

понятно, то есть в ГБ идет уже счет

megaloman 08-04-2016 18:53 2624503

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 2625029

Большое спасибо

Fantastish 11-04-2016 12:29 2625092

Такс возникла еще непонят ка, после работы скрипта, получилось вот такое:
1я646я506я770 Ў*©в в

Iska 11-04-2016 12:53 2625100

Fantastish, неправильная кодировка. Скриншот покажите.

megaloman 11-04-2016 14:48 2625130

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 2625306

Спасибо.
Результат:
+++ 1*665*816*255 байт
Тему можно закрывать, я так понимаю таким же образом можно и смотреть занятый объем на дисках, а можно ли обратно проверять наличие логических дисков и оставшееся свободное место?
Если это другой вопрос, то не критично, можно не продолжать обсуждение.


Время: 20:07.

Время: 20:07.
© OSzone.net 2001-