Компьютерный форум 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=176253)

shadowbat 21-05-2010 20:36 1418416

узнать размер папок. экспорт в txt
 
как реализовать через bat либо vbs

чтобы узнать полный размер всех папок, которые находятся с .bat в одной папке.
и сохранить список размеров по порядочку в txt (без названия папок. просто столбик размеров в Мб (желательно) либо в Кб)

как сделать чтобы полный размер папок считался так, как будто я на нее в винде нажал alt+enter

El Sanchez 21-05-2010 22:35 1418497

Цитата:

Цитата shadowbat
как реализовать через bat либо vbs
чтобы узнать полный размер всех папок, которые находятся с .bat в одной папке. »

shadowbat, и CMD, и WSH:
Код:

@Echo Off
SetLocal EnableDelayedExpansion
Echo WScript.Echo CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size>GetDirSize.vbs
For /D %%A In (*) Do (
        For /F %%B In ('CScript //Nologo GetDirSize.vbs "%%A"') Do (
                Set Bytes=%%B
                Set /A IntMB=!Bytes!/1048576
                Set /A IntKB=!Bytes!/1024
                Set /A FloatMB=!Bytes!%%1048576/10000
                Set /A FloatKB=!Bytes!%%1024/10
        )
        Echo !IntMB!,!FloatMB! MBytes or !IntKB!,!FloatKB! KBytes or !Bytes! Bytes>>GetDirsSize.txt
)
EndLocal
Del /F /Q GetDirSize.vbs 1>nul 2>&1


shadowbat 21-05-2010 22:59 1418505

мммм... какая вкуснятина!! работает!

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

megaloman 21-05-2010 23:56 1418538

Мне кажется то, что предложено El Sanchez несколько эклектично, хотя по своему очень интересно, логичнее всё сделать в VBS, да и если к какой-либо папке нет доступа (например, чаще всего "System Volume Information" или к какой-то сетевой) приведенное решение не отработает.
Вот решение полностью на VBS
Код:

DirName = "c:\TraLaLa\"

'                DirName = ""    ' Если скрипт в исследуемой папке и не хочется указывать к ней путь

If Len(DirName)=0 Then DirName=Replace(WScript.ScriptFullName,WScript.ScriptName,"")

WhereOut = DirName + "SizeSubDir.inf"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folders = FSO.GetFolder(DirName).SubFolders

Out = ""

For Each Folder In Folders
   
    On Error Resume Next
    FolderSize = CStr(Round(Folder.Size / 1024 / 1024,2))
   
    If Err.Number <> 0 Then FolderSize = "Не определено"
    FolderSize = Right("              " + FolderSize, 14)
   
    Out = Out + FolderSize + "  " + Folder.Name + vbCrLf ' Если не надо имена, удалить +"  "+Folder.Name
Next

Set F = FSO.OpenTextFile(WhereOut, 2, True)
F.Write Out
F.Close

Можно указать, в какой папке вам интересен размер подпапок, если интересен размер подпапок там, откуда запущен скрипт, надо указать
DirName = ""
(в приведенном скрипте эта строка закомментирована и не выполняется)

amel27 22-05-2010 08:31 1418628

Цитата:

Цитата El Sanchez
и CMD, и WSH »

CMD не поддерживает арифметику 64-битных чисел, что соответствует размеру папки >2Gb
читать дальше »
Код:

@echo off

set X=2147483648
echo %X%

set /A X+=1
echo %X%

pause >nul


так что вариантов два:

- округлять простым отбрасыванием младших цифр в строке (3/6/9) через SET;
- включить эту функциональность в VBS-модуль:

Код:

CHCP 1251 >Nul
Echo Do While Not WScript.StdIn.AtEndOfStream::WScript.Echo Round(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.StdIn.ReadLine).Size/2^^20,2)::Loop>GetDirSize.vbs
DIR /AD/B|CScript //Nologo GetDirSize.vbs

или так:
Код:

Echo Do While Not WScript.StdIn.AtEndOfStream::WScript.Echo Round(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.StdIn.ReadLine).Size/2^^20,2)::Loop>GetDirSize.vbs
CMD /U/C "DIR /AD/B"|CScript //U //Nologo GetDirSize.vbs

Цитата:

Цитата megaloman
то, что предложено El Sanchez несколько эклектично »

увы, многие операции проще и быстрее выполнить в CMD... пока Microsoft не начнет заботиться о функциональной преемственности своих скриптовых платформ, для многих задач такое взаимодействие будет просто необходимо

megaloman 22-05-2010 10:53 1418680

Цитата:

Цитата amel27
увы, многие операции проще и быстрее выполнить в CMD »

- это так, но основной недостаток CMD - нет толкового учебника с примерами. То, что Вы демонстрируете на форуме, нигде больше я не видел. WSH и VBS (JS) тем и хороши, что они описаны. Хотя по скорости CMD часто вне конкуренции. Однако в этом случае когда я попробовал решить эту задачу тупым суммированием размеров файлов, получил монстра с долгим выполнением (при том, что я не подозревал о верхней границе чисел в CMD).
Код:

Echo Off
del SizeSubDir.inf >Nul

FOR /F "usebackq delims=" %%i IN (`dir /A:D /B`) DO Call :SubDir "%%~fi" "%%i"
GoTo :EOF

:SubDir
Set Size=0
FOR /R %1 %%s IN (*.*) DO Call :SubDirSize %%~zs

rem Если мегабайты
rem Set /A Size=%Size%/1048576
rem Set Size=      %Size%
rem Echo %Size:~-6% Mb  %2>>SizeSubDir.inf

rem Если килобайты
Set /A Size=%Size%/1024
Set Size=        %Size%
Echo %Size:~-9% Kb  %2>>SizeSubDir.inf

GoTo :EOF

:SubDirSize
Set /A Size=%Size%+%1

Любой язык силён теми функциями, к которым можно обратиться. И у CMD таких возможностей масса. Но хелпами сыт не будешь

shadowbat 22-05-2010 11:00 1418687

Цитата:

Цитата megaloman
То, что Вы демонстрируете на форуме, нигде больше я не видел »

надо эти все знания amel27 передать поколениям :) настоящий специалист

amel27 22-05-2010 14:11 1418761

Цитата:

Цитата megaloman
основной недостаток CMD - нет толкового учебника с примерами. То, что Вы демонстрируете на форуме, нигде больше я не видел. WSH и VBS (JS) тем и хороши, что они описаны. »

и тем не менее, 95% применяемого есть в справке... другое дело, что написана она не для людей + корявый перевод + ошибки... например, "IF /?" утверждает, что равенство проверяется оператором "EQL", тогда как на самом деле "EQU"... что касается оставшихся недокументированных 5%, тут действительно сложно - лексика CMD гуглю не поддается, примеры рулят! :)

Цитата:

Цитата megaloman
по скорости CMD часто вне конкуренции. Однако в этом случае когда я попробовал решить эту задачу тупым суммированием размеров файлов, получил монстра с долгим выполнением »

скорость CMD обеспечивается штатными ф-циями и внешними консольными утилитами, написанными на Win32 API (быстрее не бывает), сам CMD-интерпретатор (циклы, операторы и т.п.) работает медленней WSH

Цитата:

Цитата shadowbat
надо эти все знания amel27 передать поколениям »

дык всё в ваших руках - изучайте!.. а мы уж в меру сил и возможностей кодом нагрузим ;)

Petya V4sechkin 22-05-2010 15:41 1418799

[решено] Вывод размера папки в отдельный файл скриптом

palexa 10-11-2018 14:32 2840144

Код:

DirName = "c:\TraLaLa\"

'                DirName = ""    ' Если скрипт в исследуемой папке и не хочется указывать к ней путь

If Len(DirName)=0 Then DirName=Replace(WScript.ScriptFullName,WScript.ScriptName,"")

WhereOut = DirName + "SizeSubDir.inf"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folders = FSO.GetFolder(DirName).SubFolders

Out = ""

For Each Folder In Folders
   
    On Error Resume Next
    FolderSize = CStr(Round(Folder.Size / 1024 / 1024,2))
   
    If Err.Number <> 0 Then FolderSize = "Не определено"
    FolderSize = Right("              " + FolderSize, 14)
   
    Out = Out + FolderSize + "  " + Folder.Name + vbCrLf ' Если не надо имена, удалить +"  "+Folder.Name
Next

Set F = FSO.OpenTextFile(WhereOut, 2, True)
F.Write Out
F.Close

Интересное решение

Подскажите, что надо дописать в этот скрипт, что бы в конце был суммирующий результат папки c:\TraLaLa\

Iska 10-11-2018 14:51 2840149

Цитата:

Цитата palexa
Подскажите, что надо дописать в этот скрипт, что бы в конце был суммирующий результат папки c:\TraLaLa\ »

Ничего.
Быстро
Код:

Option Explicit

WScript.Echo WScript.CreateObject("Scripting.FileSystemObject").GetFolder("C:\Мои проекты").Size

WScript.Quit 0

Правильно
Код:

Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile


If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                WScript.Echo objFSO.GetFolder(strSourceFolder).Size
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

WScript.Quit 0


palexa 10-11-2018 15:15 2840152

Что значит ничего ?

Скрипт создаёт файл в котором пишет размер + название каждой папки в директории c:\TraLaLa\

Осталось дописать что бы определил размер самой директории c:\TraLaLa\ и тоже дописал в этот файл

Может всё таки поможете ?

Iska 10-11-2018 15:33 2840156

Код:

Next

With FSO.GetFolder(DirName)
    Out = Out & CStr(Round(.Size / 2^20, 2)) & "  " & .Name & vbCrLf
End With


Set F = FSO.OpenTextFile(WhereOut, 2, True)

Не проверялось.

palexa 10-11-2018 15:42 2840158

не дописывает

Iska 10-11-2018 16:19 2840162

Поправил код. Пробуйте.

megaloman 10-11-2018 16:29 2840165

palexa, О, неужели это я ваял? Как молоды мы были ... Вставьте между выделенным
Код:

Next

If FSO.FileExists(WhereOut) Then FSO.DeleteFile (WhereOut)

FolderSize = CStr(Round(FSO.GetFolder(DirName).Size / 1024 / 1024, 2))
FolderSize = Right("              " + FolderSize, 14)
Out = Out + FolderSize + "  " + DirName

Set F = FSO.OpenTextFile(WhereOut, 2, True)

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

WhereOut = "Z:\SizeSubDir.inf"

palexa 10-11-2018 16:49 2840171

Iska и megaloman спасибо большое

Iska 10-11-2018 17:39 2840181

Цитата:

Цитата megaloman
Возможна неточность: при существующем пути к Out-файлу общий размер папки после работы скрипта будет отличаться на размер выходного файла. »

Не будет. Вы же его создаёте после подсчёта.

megaloman 10-11-2018 17:43 2840182

palexa,
А попробуйте вот такой батник
Код:

@Echo Off
cls
        Set "BoxIn=D:\Мой контент"
        Set "Out=D:\Мой контент.inf"

        Set "Def="
        Set "Marg=  "
        Set "Marg="
       
        Call :DSize "%BoxIn%" "iSize"
        >"%Out%" Echo %iSize%  %BoxIn%

        For /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /B /A:D`) DO Call :Out "%BoxIn%\%%d" %Def%- "%Marg%"
pause
GoTo :Eof

:Out
        Call :DSize %1 "iSize"
        >>"%Out%" Echo %iSize%  %~3%2%~nx1
        For /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /B /A:D`) DO Call :Out "%~1\%%d" %2- "%~3%Marg%"
GoTo :Eof

:DSize
SetLocal EnableExtensions EnableDelayedExpansion
        For /F "usebackq delims=" %%z IN (`2^>nul Dir %1 /S /A`) DO Set ZZ=!Z1! &Set Z1=%%z
        Set "ZZ=%ZZ:~5%"
EndLocal &Set "%~2=%ZZ%"
GoTo :Eof

Цитата:

Цитата Iska
Не будет. Вы же его создаёте после подсчёта. »

Увы, будет. После подсчета файл записывается внутрь рассматриваемой папки и его размер в общем итоге не учтен.
Цитата:

Цитата megaloman
Либо надо явно прописать другой путь к выходному файлу в любое доступное место вне анализируемой »


Iska 10-11-2018 17:57 2840183

Цитата:

Цитата megaloman
Увы, будет. После подсчета файл записывается внутрь рассматриваемой папки и его размер в общем итоге не учтен. »

А… Вы вот в каком плане. Ну, так я про то же. Только я-то полагал, что именно так и будет правильным считать — без его учёта.

palexa 10-11-2018 18:11 2840185

работает батник, только слишком много информации, выводит все подпапки, абсолютно все

Но если речь зашла о батнике, Вы не могли бы выложить код батника, который посчитает размер как и предоставленный Вами vbs
размер каждой папки в директории ну и в конце(в начале) размер этого каталога

баником удобнее будет

megaloman 10-11-2018 20:00 2840207

palexa, Ломать - не строить, душа не болит. Закомментируйте строку
Код:

rem        For /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /B /A:D`) DO Call :Out "%~1\%%d" %2- "%~3%Marg%"
Кстати, подправил код: корректнее в выделенной строке параметр взять в кавычки.
Добавил /A в выделенной строке.

palexa 11-11-2018 05:50 2840245

Кстати, что бы читать нормально файл блокнотом, пришлось добавить кодировку в строку
Код:

For /F "usebackq delims=" %%z IN (`2^>nul chcp 1251^& Dir %1 /S /A`) DO Set ZZ=!Z1! &Set Z1=%%z

megaloman 11-11-2018 06:44 2840246

palexa, а почему бы не добавить
chcp 1251 >nul
в самое начало батника, третей строкой, а не внутрь цикла. При этом, естественно, и сам батник сохранить в 1251 при наличии кириллицы в задаваемых путях?

Iska 11-11-2018 07:14 2840249

Лучше обзавестись вменяемым средством для работы с поддержкой различных кодировок.

palexa 11-11-2018 11:07 2840261

ещё хочу спросить, как в этом батнике сделать что бы он не переписывал файл, а дописывал строки ниже

megaloman 11-11-2018 12:01 2840269

palexa, вместо
>"%Out%" Echo %iSize% %BoxIn%
>>"%Out%" Echo %iSize% %BoxIn%
А еще лучше им не пользоваться - по сравнению с VBS медленно.

palexa 11-11-2018 12:22 2840277

спасибо

Заметил что на много медленнее, но пока устроит

megaloman 11-11-2018 19:15 2840303

palexa,
Вот вариант: гибрид bat и js, работает многократно быстрее голимого CMD, можно получить байты, килобайты, мегабайты, гигабайты
Код:

@set @E=1; /*

@Echo Off
        CHCP 1251 >nul
        Set "BoxIn=D:\Мой контент"

        Set  "Out=D:\Мой контент байт.inf"
        Set "Out1=D:\Мой контент килобайт.inf"
        Set "Out2=D:\Мой контент мегабайт.inf"
        Set "Out3=D:\Мой контент гигабайт.inf"

        >>"%Out%"  Call :InDir "%BoxIn%"
        >"%Out1%" Call :InDir "%BoxIn%" 1
        >"%Out2%" Call :InDir "%BoxIn%" 2
        >"%Out3%" Call :InDir "%BoxIn%" 3
Pause
GoTo :Eof

:InDir
        FOR /F "usebackq delims=" %%z IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%~1" "%~2"`) DO Call :Out "%%z" "%~1" "%~2"
        For /F "usebackq delims=" %%d IN (`2^>nul Dir "%~1" /B /A:D`) DO (
                FOR /F "usebackq delims=" %%z IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%~1\%%d" "%~2"`) DO Call :Out "%%z" "%%d" "%~2"
        )
GoTo :Eof

:Out
SetLocal
        Set "S=            %~1"
        Set "S=%S:~-12%"
        If "%~3"=="1" Set "S=%S:~-9%"
        If "%~3"=="2" Set "S=%S:~-6%"
        If "%~3"=="3" Set "S=%S:~-3%"
        Echo %S% %2
EndLocal
GoTo :Eof

*/

var oArg = WScript.Arguments;
if (oArg.Count() < 1) {
        WScript.Echo("Arguments absent");
        WScript.Quit(1);
}

var FSO=WScript.CreateObject("Scripting.FileSystemObject");

if (!FSO.FolderExists(oArg(0))) {
        WScript.Echo(oArg(0) + " not found");
        WScript.Quit(2);
}

try {var sFold=FSO.GetFolder(oArg(0)).Size}
        catch (err) {if (err != 0) {
                        WScript.Echo(oArg(0)+" "+err.description);
                        WScript.Quit(3)}
                        }
if (oArg.Count() == 2) {
        if (oArg(1)==1) sFold = Math.round(sFold/1024);
        if (oArg(1)==2) sFold = Math.round(sFold/1024/1024);
        if (oArg(1)==3) sFold = Math.round(sFold/1024/1024/1024);
}

WScript.Echo(sFold);
WScript.Quit(0)

Обратите внимание, здесь сделана возможность выдавать размер папки в разных единицах. В этом примере - 4 выходных файла. Оставьте вызов только одного варианта. Чтобы выходной файл дописывался, вместо > рисуйте >>

palexa 11-11-2018 19:24 2840304

Спасибо, попробую

palexa 11-11-2018 20:22 2840311

Как оказалось время исполнения имеет значение,
Пишу
Код:

@set @E=1; /*
echo %DATE% - %time:~,5% - %COMPUTERNAME% - Начало>>D:\log.txt
@Echo Off

Код:

::Pause
Echo on
echo %DATE% - %time:~,5% - %COMPUTERNAME% - Конец>>D:\log.txt
GoTo :Eof

Но не записывает конец

Что бы считало размер только одной верхней директории за комментировал строки
:: FOR /F "usebackq delims=" %%z IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%~1\%%d" "%~2"`) DO Call :Out "%%z" "%%d" "%~2"

Этого достаточно для скорости подсчёта ?

megaloman 11-11-2018 20:37 2840313

palexa, переименуйте скрипт в txt, приложите к сообщению

palexa 11-11-2018 20:42 2840315

Вложений: 1
Вот, прикладываю

Iska 11-11-2018 20:46 2840316

Цитата:

Цитата palexa
Пишу »

Зараз приучайтесь писать так:
Код:

>>"D:\log.txt" echo %DATE% - %time:~,5% - %COMPUTERNAME% - Начало
Код:

>>"D:\log.txt" echo %DATE% - %time:~,5% - %COMPUTERNAME% - Конец

megaloman 11-11-2018 21:48 2840317

Вложений: 1
palexa, Не делайте комментарии ::

palexa 11-11-2018 22:23 2840319

Первый батник, ууу считает, устал ждать, и это самый маленький по размеру сервер

11.11.2018 - 19:58 - TS4 - Начало
122897 File(s) 43*007*258*445 bytes c:\Users\
11.11.2018 - 21:08 - TS4 - Конец

Последний обломался :( , странно как то

11.11.2018 - 21:14 - TS4 - Начало
on denied "c:\Users\"
11.11.2018 - 21:14 - TS4 - Конец 1

Цитата:

Цитата megaloman
palexa, Не делайте комментарии :: »

ок

Я думал оно раз в пять быстрее будет считать, скажу админу что можно задачу эту в планировщик поставить, пусть думает, вместо того что бы меня эксплуатировать ручным трудом

Спасибо за помощь

it3 21-08-2019 06:26 2884880

Доброго времени суток!
Не стал создавать новую тему, решил написать в подобную:
Есть перечень каталогов:
O:\Folder1
O:\Folder1\podFolder1
O:\Folder2\podFolder2\podpodFolder2
O:\Folder3\podFolder3
... ... ... ... ...
O:\Folder4
O:\Folder5\podFolder5
O:\Folder6
... ... ... ... ...
размер которых необходимо вывести в *.txt/*.csv (Формат: Папка -> Размер).
Прошу помощи.

it3 21-08-2019 07:10 2884885

Цитата:

Цитата megaloman
- что такое перечень? Это текстовый файл, либо этот перечень предполагается организовать внутри скрипта? Размер в чём: байтах, гигабайтах? »

Перечень - внутри скрипта. Размер в Гигабайтах.

megaloman 21-08-2019 07:58 2884886

CMD+JS Есть перечень каталогов, размер которых необходимо вывести в *.txt
Код:

@set @E=1; /*

@Echo Off
        CHCP 1251 >nul
        Set "Out3=D:\Мой контент гигабайт.txt"
        2>nul Del "%Out3%"

rem 0-байты, 1-килобайты, 2-мегабайты, 3-гигабайты

        >>"%Out3%" Call :InDir "D:\Мой контент" 3
        >>"%Out3%" Call :InDir "D:\Мой контент\Музыка" 3
        >>"%Out3%" Call :InDir "D:\Мой контент\Музыка\_Скопировано.wd" 3
        >>"%Out3%" Call :InDir "D:\Мой контент\Музыка\_Скопировано.wd\Vivaldi-1" 3
        >>"%Out3%" Call :InDir "D:\CMD_Forum\Муз" 3
GoTo :Eof

:InDir
        FOR /F "usebackq delims=" %%z IN (`Cscript //NoLogo /E:jscript "%~dpnx0" "%~1" "%~2"`) DO Call :Out "%%z" "%~1" "%~2"
GoTo :Eof

:Out
SetLocal
        Echo %~2 -^> %~1
EndLocal
GoTo :Eof

*/

var oArg = WScript.Arguments;
if (oArg.Count() < 1) {
        WScript.Echo("Arguments absent");
        WScript.Quit(1);
}

var FSO=WScript.CreateObject("Scripting.FileSystemObject");

if (!FSO.FolderExists(oArg(0))) {
        WScript.Echo("not found");
        WScript.Quit(2);
}

try {var sFold=FSO.GetFolder(oArg(0)).Size}
        catch (err) {if (err != 0) {
                        WScript.Echo(err.description);
                        WScript.Quit(3)}
                        }
if (oArg.Count() == 2) {
        if (oArg(1)==1) sFold = Math.round(sFold/1024);
        if (oArg(1)==2) sFold = Math.round(sFold/1024/1024);
        if (oArg(1)==3) sFold = Math.round(sFold/1024/1024/1024);
}

WScript.Echo(sFold);
WScript.Quit(0)


it3 21-08-2019 08:50 2884892

megaloman, с сетевыми дисками скрипт не хочет работать.
Код:

O:\Folder\Folder -> not found
O:\Folder\Folder\Folder -> not found
O:\Folder\Folder\Folder7 -> not found
O:\Folder\Folder8 -> not found


it3 21-08-2019 08:56 2884894

Цитата:

Цитата megaloman
it3, что такое сетевой диск? Задан буквой или сетевым путем? А прав хватает? »

Задана буква, но даже если задать сетевой путь - аналогично. Прав хватает.
Код:

O:\Folder\Folder -> not found
O:\Folder\Folder\Folder -> not found
O:\Folder\Folder\Folder7 -> not found
O:\Folder\Folder8 -> not found


megaloman 21-08-2019 09:21 2884899

it3,
Код:

O:\Folder -> 167450
\\Server\Test1\Folder -> 167450

Значит, указываете пути неправильно
Если в путях кириллица - сохраните скрипт в 1251 кодировке (например, notepad)
Проделайте в командном окне
Код:

>c:\txt.txt 2>&1 Dir /b /A:D "O:\Folder"
Файл c:\txt.txt прикрепите к сообщению

it3 21-08-2019 09:39 2884901

Вложений: 1
Цитата:

Цитата megaloman
Файл c:\txt.txt прикрепите к сообщению »

Во вложении.
Цитата:

Цитата megaloman
Значит, указываете пути неправильно
Если в путях кириллица - сохраните скрипт в 1251 кодировке (например, notepad)
Проделайте в командном окне »

Изменил Кириллицу на Windows-1251. Безрезультатно.
Но скорее всего причина именно в ней.

it3 21-08-2019 10:04 2884904

Цитата:

Цитата megaloman
it3, Переименуйте скрипт в .txt, приложите к сообщению »

Разобрался, работает. Прошу прощения.
Причина была в том, что скрипт до конца не дорабатывал. Т.е. я преждевременно открывал готовый результат, чтобы убедиться в том, что результат записывается. Но т.к. объем данных в каталогах велик, процесс занимает довольно-таки длительное время. Решение - дождаться завершения.
Спасибо.

Возможно ли доработать скрипт таким образом, чтобы он полученное значением складывал в существующий Excel-документ (с расширением *.xlsx) во второй столбец начиная со второй строки (т.к. порядок каталогов в *.cmd-файле соответствует порядку каталогов в Excel-документе?

megaloman 21-08-2019 10:17 2884905

it3,
Цитата:

Цитата it3
Возможно ли доработать скрипт »

- в CMD не нужно, получится извращение. Надо либо написать скрипт на чём-то другом (vbs, например). Имена папок брать прямо из таблицы.
Еще лучше сделать по другому: в Excel.xlsm-документе сделать макрос.
Причём оформить его в виде функции. Хотя, если папищи громадные, наверное это будет не очень удобно. Надо пробовать.
Приказывайте!
Цитата:

Цитата it3
во второй столбец начиная со второй строки »

А чем кончается список папок?

it3 21-08-2019 10:54 2884909

Цитата:

Цитата megaloman
А чем кончается список папок? »

Пустой ячейкой.
Т.е. в первой строке/столбце наименование столбца, далее, начиная со второй строки первого столбца список путей к каталогам.

megaloman 21-08-2019 11:12 2884912

Вложений: 1
it3, Идея с функцией мне самому понравилась :clapping: Переименуйте приложенный файл. В ячейках функция, например:
Код:

=FFolderSize(C8)
В С8 - путь. Размножаете функцию стандартным образом по ячейкам.
Устроит?

it3 21-08-2019 11:51 2884916

Цитата:

Цитата megaloman
В С8 - путь. Размножаете функцию стандартным образом по ячейкам.
Устроит? »

В принципе - отлично.
За исключением того, когда выполняется считывание каталогов - все открытые документы Excel зависают. :-)

Iska 21-08-2019 12:26 2884925

Цитата:

Цитата it3
За исключением того, когда выполняется считывание каталогов - все открытые документы Excel зависают. :-) »

Не «открытые документы Excel зависают». Само приложение занято.

Откройте отдельный экземпляр Microsoft Excel, и в нём уже открывайте данную Рабочую книгу.

megaloman, делитель (байты/килобайты/мегабайты/гагабайты) можно при желании добавить вторым аргументом функции.

it3 21-08-2019 12:38 2884932

Цитата:

Цитата Iska
Откройте отдельный экземпляр Microsoft Excel, и в нём уже открывайте данную Рабочую книгу. »

Действительно.
Спасибо.

megaloman 21-08-2019 14:54 2884953

it3, VBS
Категорически не советую, пока скрипт не отработал, работать с другой таблицей в другом окне.
Путь к таблице, адреса ячеек пропишИте свои.
Код:

FileXLS = "Z:\Soft_In\я19082113.xlsx"

Fname1 = "C6"  ' Первая ячейка с путём
fsize1 = "F6"  ' Первая ячейка с размером
koeff = 2      ' 0-байты, 1-Kb, 2-Mb, 3-Gb, 4-Tb

With CreateObject("Excel.Application")
    .Visible = True
    .Workbooks.Open (FileXLS)

    i = 0
    Do
        Pfold = .Range(Fname1).Offset(i, 0)
        If InStr(1, Pfold, "\") = 0 Then Exit Do
        .Range(fsize1).Offset(i, 0) = FFolderSize(Pfold, koeff)
        i = i + 1
    Loop
End With
MsgBox "Done!"
' ===============================

Function FFolderSize(arg, k)
    On Error Resume Next
    Err.Number = 0
   
    FFolderSize = CreateObject("Scripting.FileSystemObject").GetFolder(arg).Size
    If Err.Number <> 0 Then
            FFolderSize = Err.Description
    Else
        If k = 1 Then FFolderSize = FFolderSize / 1024
        If k = 2 Then FFolderSize = FFolderSize / 1024 / 1024
        If k = 3 Then FFolderSize = FFolderSize / 1024 / 1024 / 1024
        If k = 4 Then FFolderSize = FFolderSize / 1024 / 1024 / 1024 / 1024
    End If
    On Error GoTo 0
End Function

Iska,
Цитата:

Цитата Iska
делитель (байты/килобайты/мегабайты/гагабайты) можно при желании добавить вторым аргументом функции. »

Не стал этого делать для функции в ячейке: решил, так гибче. В формуле в ячейке написать деление не проблема, тем более, возможно, еще приделать какую-нибудь функцию, типа ОКРУГ.
В скрипте решил, что здесь удобнее приделать еще один аргумент, поэтому чуть доработал.

YuS_2 21-08-2019 20:52 2885014

Цитата:

Цитата it3
размер которых необходимо вывести в *.txt/*.csv (Формат: Папка -> Размер). »

Цитата:

Цитата it3
Но т.к. объем данных в каталогах велик, процесс занимает довольно-таки длительное время. »

Скрипт powershell (два каталога, общим размером 65Гб и с количеством файлов 51837, вычисляются за 27 сек.):
в скрипт встроен таймер, результат выводится в файл execution_speed.txt
таймер безболезненно можно удалить (первые две строки и последние тоже две)
Код:

$watch = [system.diagnostics.stopwatch]::startnew() #таймер
$watch.start() #запуск таймера

function Get-SizeDirectory {
        param (
                [parameter(ValueFromPipeline=$true)]
                [string[]]$arr
        )
        process {
                foreach ($item in $arr) {
                        $tmp = gi $item
                        $math = dir -lit $tmp.fullname -rec -force|
                                ?{!$_.psiscontainer}|measure -prop length -sum
                        [pscustomobject]@{
                                Name = $tmp.name #Имя каталога
                                Fullname = $tmp.fullname #Абсолютный путь с именем
                                Count = $math.count #Счетчик файлов в каталоге
                                Size = "{0:G}" -f ($math.sum/$k) #Размер каталога
                        }
                }
        }
}

#Перечисление каталогов непосредственно в скрипте:
#для использования, блок раскомментировать, при этом, необходимо
#закомментировать обе строки получения массива из файла ниже
<#
$fld = @(
        'O:\Folder1',
        'O:\Folder1\podFolder1',
        'O:\Folder2\podFolder2\podpodFolder2'
        #и т.д.
)
#>

#Либо получение массива каталогов из текстового файла (один каталог на строку)
$file = 'd:\folders.txt'
$fld = gc $file -enc utf8

#Коэффициент единиц размера каталогов (На выбор: <1|1Kb|1Mb|1Gb|1Tb>):
$k = '1Gb'

#Файл .csv с результатом:
$out = 'result.csv'

$fld|get-sizedirectory|select fullname,count,size|
convertto-csv -not -del ';'|out-file $out -enc utf8

$watch.stop() #остановка таймера
$watch.elapsed >execution_speed.txt #время выполнения

вывод можно сделать и непосредственно в файл .xlsx, но, имхо, это лишнее, т.к. .csv легко открывается в Excel

it3 22-08-2019 09:48 2885059

Цитата:

Цитата megaloman
it3, VBS
Категорически не советую, пока скрипт не отработал, работать с другой таблицей в другом окне.
Путь к таблице, адреса ячеек пропишИте свои. »

megaloman, подскажите пожалуйста, в некоторых "путях"/каталогах вместо размера пишется текст:
Код:

Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден
Путь не найден

Хотя, по факту, путь правильный, и если пройти по этому пути, и провалиться в подкаталог, и вставить этот путь в табличку, то размер считывается, а корневой каталог, не считывается. Привилегии полные.

megaloman 22-08-2019 10:27 2885062

it3, Не знаю.
Цитата:

Цитата it3
Хотя, по факту, путь правильный »

Цитата:

Цитата Козьма Прутков
Если на клетке слона прочтёшь надпись «буйвол», не верь глазам своим.

Значит, что-то Вы не то пишите, ИМХО.
Мой полёт извращенной фантазии:
1. Вместо латинской буквы стоИт русская: (О-O, например)
2. В ячейке в пути перед путём есть пробел(ы).
3. Путь указан в кавычках без знака = впереди. То есть, "D:\Тра ля ля" - нельзя, а ="D:\Тра ля ля" можно.
Естественно, можно просто D:\Тра ля ля (без пробела впереди)

Я бы рекомендовал для указанных Вами путей, где получили "Путь не найден" найти эту папку в проводнике, правой кнопкой мышки вызвать свойства, в закладке Общие, строке Расположение выделить и скопировать путь, вставить в ячейку таблицы.

А вот еще возможность: скопировать указанный путь из ячейки таблицы, и в командном окне проделать
Dir "вставленный из буфера путь\*.*"
Посмотреть, что на это скажет команда Dir

Весь этот Марлезонский балет нужен, чтобы убедиться в правильности указания пути.

it3 22-08-2019 10:51 2885070

Цитата:

Цитата megaloman
Значит, что-то Вы не то пишите, ИМХО.
Мой полёт извращенной фантазии:
1. Вместо латинской буквы стоИт русская: (О-O, например)
2. В ячейке в пути перед путём есть пробел(ы).
3. Путь указан в кавычках без знака = впереди. То есть, "D:\Тра ля ля" - нельзя, а ="D:\Тра ля ля" можно.
Естественно, можно просто D:\Тра ля ля (без пробела впереди)
Я бы рекомендовал для указанных Вами путей, где получили "Путь не найден" найти эту папку в проводнике, правой кнопкой мышки вызвать свойства, в закладке Общие, строке Расположение выделить и скопировать путь, вставить в ячейку таблицы.
А вот еще возможность: скопировать указанный путь из ячейки таблицы, и в командном окне проделать
Dir "вставленный из буфера путь\*.*"
Посмотреть, что на это скажет команда Dir
Весь этот Марлезонский балет нужен, чтобы убедиться в правильности указания пути. »

Первое что я сделал - это скопировал путь из "Расположения" и вставил в ячейку Excel. Команда dir отрабатывает (выводится количество папок в каталоге и свободное пространство в байтах).
Даже если скопировать этот путь из Excel и вставить в проводник - путь рабочий. Если вставить из Excel в командную строку - тоже работает.

Iska 22-08-2019 11:17 2885075

it3, ну, упакуйте Ваш получившийся файл Рабочей книги в архив, каковой приложите к сообщению.


Время: 15:09.

Время: 15:09.
© OSzone.net 2001-