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

Prog-Man 24-01-2015 05:22 2460499

требуется найти разницу в размере папки до работы скрипта и после
 
Здравствуйте! Собственно все написано в теме.
Нашел две программы выводящие размер папки, но не знаю как получить эти данные в виде переменной.

Disk Usage
https://technet.microsoft.com/en-us/.../bb896651.aspx
Код:

Files:        109
Directories:  13
Size:        204а480а579 bytes
Size on disk: 204а745а120 bytes

Diruse
https://technet.microsoft.com/en-us/...99(WS.10).aspx
Код:

Size  (b)  Files  Directory
204478577    109  SUB-TOTAL: C:\Z
204478577    109  TOTAL: C:\Z


Iska 24-01-2015 07:26 2460506

Prog-Man, лучше ни то, ни другое. Арифметика пакетных файлов целочисленна, 32-разрядна (один бит отнесён под знак) и посему крайне ограничена диапазоном от -2,147,483,648 до 2,147,483,647.

Вам под какие цели? Можно, например, использовать mshta и VBScript/JScript внутри, наподобие:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=E:\Песочница\0425

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size)}};catch (e){};close();"`
        ) do set sPrevFolderSize=%%i
       
        echo Previously size [!sPrevFolderSize!].
       
        rem Здесь начинается Ваш код
        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
        rem Здесь заканчивается Ваш код
       
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size - !sPrevFolderSize!)}};catch (e){};close();"`
        ) do set sDifference=%%i
       
        echo Difference after working is [!sDifference!].
) else (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0

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

Prog-Man 24-01-2015 08:47 2460510

Вот мой скрипт(сильно не пинайте это мой первый скрипт).
Код:

@echo off
cd %1

:: Инициализация Секундомера
:: http://forum.oszone.net/post-2275768-8.html
%USERPROFILE%\Desktop\Util\timemer my_backup start

:: Оптимизация JPG
:: jpegtran http://jpegclub.org/jpegtran/
if not exist %1\*.jpg if not exist %1\*.jpeg goto mp3
pause
md "%~1\OptimizedJPEGS"
for %%i in (*.jpg *.jpeg) do %USERPROFILE%\Desktop\Util\jpegtran.exe -optimize -progressive -copy none "%%i" "%~1\OptimizedJPEGS\%%i"
move /Y "%~1\OptimizedJPEGS\*.*" "%~1"
rd "%~1\OptimizedJPEGS"
:mp3

:: Оптимизация MP3
:: mp3packer 2.04
if not exist %1\*.mp3 goto gif
md "%~1\OptimizedMP3"
for %%i in (*.mp3) do %USERPROFILE%\Desktop\Util\mp3packer64.exe -f -z --workers 3 "%%i" "%~1\OptimizedMP3\%%i"
move /Y "%~1\OptimizedMP3\*.*" "%~1"
rd "%~1\OptimizedMP3"
:gif

:: Оптимизация GIF
:: gifsicle 1.87 9.Dec.2014 http://www.lcdf.org/gifsicle/
if not exist %1\*.gif goto bmp
for %%i in (*.gif) do %USERPROFILE%\Desktop\Util\gifsicle.exe -b -O3 "%%i"
:bmp

:: Конвертирование BMP в PNG
if not exist %1\*.bmp goto png
md "%~1\OptimizedBMP_PNG"
for %%i in (*.BMP) do "%USERPROFILE%\Desktop\Util\pngout.exe" "%%i" "%~1\OptimizedBMP_PNG\%%i"
move /Y "%~1\OptimizedBMP_PNG\*.*" "%~1"
rd "%~1\OptimizedBMP_PNG"
:png

:: Оптимизация PNG
:: PNGOUT http://advsys.net/ken/utils.htm
if not exist %1\*.png goto fin
for %%i in (*.png) do "%USERPROFILE%\Desktop\Util\pngout.exe" "%%i"
move /Y "%~1\OptimizedBMP_PNG\*.*" "%~1"
rd "%~1\OptimizedBMP_PNG"
md "%~1\defluff"
for %%i in (*.png) do %USERPROFILE%\Desktop\Util\defluff.exe <"%%i" > "%~1\defluff\%%i"
for %%i in (*.png) do "%USERPROFILE%\Desktop\Util\DeflOpt.exe" "%~1\defluff\%%i"
move /Y "%~1\defluff\*.*" "%~1"
rd "%~1\defluff"
:fin

:: Получаем время работы программы
%USERPROFILE%\Desktop\Util\timemer my_backup view
Pause

Если задать каталог вручную то все работает правильно, но как поступить в случае если каталог получается через
Код:

cd %1

Iska 24-01-2015 09:17 2460517

Замените:
Код:

set sSourceFolder=E:\Песочница\0425
на:
Код:

set sSourceFolder=%~1

if not defined sSourceFolder (
        echo Usage: %~nx0 ^<Source folder^>
        exit /b 2
)

и далее, в том числе и в своём коде, используйте «%sSourceFolder%» вместо «%1».

Prog-Man 24-01-2015 09:43 2460525

Код:

::@echo off
cd %1
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1

if not defined sSourceFolder (
        echo Usage: %~nx0 ^<Source folder^>
        exit /b 2
)

:: Где то после этого момента вылетает
if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size)}};catch (e){};close();"`
        ) do set sPrevFolderSize=%%i
       
        echo Previously size [!sPrevFolderSize!].

Цитата:

Цитата Iska
в том числе и в своём коде, используйте «%sSourceFolder%» вместо «%1». »

%~1 тоже заменить?

Iska 24-01-2015 10:09 2460534

Вместо «cd %1» должно быть «cd /d "%sSourceFolder%"». И не в начале пакетного файла, а в том месте, где зелёным по голубому написано «Здесь начинается Ваш код»/«Здесь заканчивается Ваш код».

Цитата:

Цитата Prog-Man
:: Где то после этого момента вылетает »

До или после вывода «Previously size […].»? Как именно «вылетает»?

Цитата:

Цитата Prog-Man
%~1 тоже заменить? »

Да.

Prog-Man 24-01-2015 10:28 2460540

Цитата:

Цитата Iska
До или после вывода «Previously size […].»? Как именно «вылетает»? »

Закрывается до вывода «Previously size […].»

Iska 24-01-2015 10:55 2460551

Ух. Покажите получившийся у Вас код.

Prog-Man 24-01-2015 10:58 2460555

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1

if not defined sSourceFolder (
        echo Usage: %~nx0 ^<Source folder^>
        exit /b 2
)

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size)}};catch (e){};close();"`
        ) do set sPrevFolderSize=%%i
       
        echo Previously size [!sPrevFolderSize!].
       

cd /d "%sSourceFolder%"
:: Инициализация Секундомера
:: http://forum.oszone.net/post-2275768-8.html
%USERPROFILE%\Desktop\Util\timemer my_backup start

:: Оптимизация JPG
:: jpegtran http://jpegclub.org/jpegtran/
if not exist %sSourceFolder%\*.jpg if not exist %sSourceFolder%\*.jpeg goto mp3
pause
md "%sSourceFolder%\OptimizedJPEGS"
for %%i in (*.jpg *.jpeg) do %USERPROFILE%\Desktop\Util\jpegtran.exe -optimize -progressive -copy none "%%i" "%sSourceFolder%\OptimizedJPEGS\%%i"
move /Y "%sSourceFolder%\OptimizedJPEGS\*.*" "%sSourceFolder%"
rd "%sSourceFolder%\OptimizedJPEGS"
:mp3

:: Оптимизация MP3
:: mp3packer 2.04
if not exist %sSourceFolder%\*.mp3 goto gif
md "%sSourceFolder%\OptimizedMP3"
for %%i in (*.mp3) do %USERPROFILE%\Desktop\Util\mp3packer64.exe -f -z --workers 3 "%%i" "%sSourceFolder%\OptimizedMP3\%%i"
move /Y "%sSourceFolder%\OptimizedMP3\*.*" "%sSourceFolder%"
rd "%sSourceFolder%\OptimizedMP3"
:gif

:: Оптимизация GIF
:: gifsicle 1.87 9.Dec.2014 http://www.lcdf.org/gifsicle/
if not exist %sSourceFolder%\*.gif goto bmp
for %%i in (*.gif) do %USERPROFILE%\Desktop\Util\gifsicle.exe -b -O3 "%%i"
:bmp

:: Конвертирование BMP в PNG
if not exist %sSourceFolder%\*.bmp goto png
md "%sSourceFolder%\OptimizedBMP_PNG"
for %%i in (*.BMP) do "%USERPROFILE%\Desktop\Util\pngout.exe" "%%i" "%sSourceFolder%\OptimizedBMP_PNG\%%i"
move /Y "%sSourceFolder%\OptimizedBMP_PNG\*.*" "%sSourceFolder%"
rd "%sSourceFolder%\OptimizedBMP_PNG"
:png

:: Оптимизация PNG
:: PNGOUT http://advsys.net/ken/utils.htm
if not exist %sSourceFolder%\*.png goto fin
for %%i in (*.png) do "%USERPROFILE%\Desktop\Util\pngout.exe" "%%i"
move /Y "%sSourceFolder%\OptimizedBMP_PNG\*.*" "%sSourceFolder%"
rd "%sSourceFolder%\OptimizedBMP_PNG"
md "%sSourceFolder%\defluff"
for %%i in (*.png) do %USERPROFILE%\Desktop\Util\defluff.exe <"%%i" > "%sSourceFolder%\defluff\%%i"
move /Y "%sSourceFolder%\defluff\*.*" "%sSourceFolder%"
rd "%sSourceFolder%\defluff"
for %%i in (*.png) do "%USERPROFILE%\Desktop\Util\DeflOpt.exe" "%%i"
:fin

:: Получаем время работы программы
%USERPROFILE%\Desktop\Util\timemer my_backup view
       
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size - !sPrevFolderSize!)}};catch (e){};close();"`
        ) do set sDifference=%%i
       
        echo Difference after working is [!sDifference!].
) else (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0


Prog-Man 25-01-2015 05:52 2460870

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=E:\Песочница\0425

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size)}};catch (e){};close();"`
        ) do set sPrevFolderSize=%%i
       
        echo Previously size [!sPrevFolderSize!].
       
        rem Здесь начинается Ваш код
        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
        rem Здесь заканчивается Ваш код
       
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size - !sPrevFolderSize!)}};catch (e){};close();"`
        ) do set sDifference=%%i
       
        echo Difference after working is [!sDifference!].
) else (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0

Самое интересное, что даже этот скрипт стал закрываться

Iska 26-01-2015 07:14 2461390

Цитата:

Цитата Prog-Man
Самое интересное, что даже этот скрипт стал закрываться »

Замените в:
Код:

set sSourceFolder=E:\Песочница\0425
«E:\Песочница\0425» на путь к Вашей папке, сохраните в файл с расширением «.cmd» в кодировке OEM/866, запустите командную строку, исполните в ней данный пакетный файл, сделайте скриншот данного окна командной строки («Alt-PrintScreen»), выложите скриншот сюда.

Prog-Man 26-01-2015 09:17 2461405

Вложений: 1
Теперь окно закрывается сразу после
Код:

        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
        rem Здесь заканчивается Ваш код


Prog-Man 26-01-2015 09:41 2461419

Похоже эта проблема как-то связана с Internet Explorer

Iska 01-02-2015 06:27 2464573

Цитата:

Цитата Prog-Man
Теперь окно закрывается сразу после
Код:

echo bla-bla-bla
 echo bla-bla-bla
 echo bla-bla-bla
 rem Здесь заканчивается Ваш код

Изображения Тип файла: png 2.png »

Цитата:

Цитата Prog-Man
Похоже эта проблема как-то связана с Internet Explorer »

Мне кажется, что эта проблема как-то связана с не только с IE, но и с тем, что Вы делаете не совсем то, что я прошу:
Цитата:

Цитата Iska
Замените в:
Код:

set sSourceFolder=E:\Песочница\0425
«E:\Песочница\0425» на путь к Вашей папке, сохраните в файл с расширением «.cmd» в кодировке OEM/866, запустите командную строку, исполните в ней данный пакетный файл, сделайте скриншот данного окна командной строки («Alt-PrintScreen»), выложите скриншот сюда. »

Я ведь просил сначала запустить командную строку, затем исполнить в ней пакетный файл. В какое место кода Вы добавили «pause»?

Prog-Man 01-02-2015 14:24 2464688

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

Цитата Iska
Я ведь просил сначала запустить командную строку, затем исполнить в ней пакетный файл. »

Про командную строку пропустил.

Iska 02-02-2015 06:03 2464987

Prog-Man, ну, вот — совсем другое дело. Итак, как мы видим, скрипт-болванка на самом деле работает. Только обязательно переименуйте его из «Start.cmd» в какое-либо иное имя, отличное от имён внутренних команд, таких как start, dir и т.п. (а по-хорошему — отличное и от внешних, поскольку некоторые не утруждают себя в пакетных файлах добавлением расширений для исполняемых файлов; Вы добавляете — на это я обратил внимание).

Теперь наша задача разобраться со вставленным Вами кодом.

jpegtran.exe
Я понимаю, что Вы явно руководствовались этим: How to Automate PNG & JPG Image Optimization in Windows - Station Four Blog кодом, но в реальности нет никакой нужды использовать промежуточные файлы. Убрал.


mp3packer.exe
Нет никакой нужды в принудительном задании числа threads параметром «--workers», поскольку явно сказано:
Цитата:

--workers #

Set the number of threads to use for -z processing. These workers will run in parallel with the rest of the program. 0 is a valid number, and corresponds to synchronous processing. The default is a function of the number of processors/cores the program detects, and will likely change in different versions of the program.
Убрал.

Писать «поверх» и без следов в виде резервного файла приложение не умеет (очевидно, сделано специально). Оставил работу со временной папкой, только теперь туда помещаются (и впоследствии удаляются) резервные копии файлов, а не оптимизированные файлы.


gifsicle.exe
Приложению было бы неплохо научиться предварительно проверять результат своей оптимизации, дабы после таковой не получались файлы большего размера, нежели оригинальные.


pngout.exe
Так и не понял, зачем Вы проделываете двойную оптимизацию над bmp-файлами — сначала как над bmp, затем повторно — как над png. Убрал.


В общем, примерно так:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1

if not defined sSourceFolder (
        echo Usage: %~nx0 ^<Source folder^>
        exit /b 2
)

call :GetTemporaryName

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size)}};catch (e){};close();"`
        ) do set sPrevFolderSize=%%i
       
        echo Previously size [!sPrevFolderSize!].
       
        pushd "%sSourceFolder%"
       
        if exist "%USERPROFILE%\Desktop\Util\." (
                PATH %USERPROFILE%\Desktop\Util;%PATH%
               
                md "%TemporaryName%"
               
                rem Инициализация Секундомера
                rem http://forum.oszone.net/post-2275768-8.html
                "timemer.exe" my_backup start
               
                rem Оптимизация JPG
                rem jpegtran http://jpegclub.org/jpegtran/
                for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.jpg" "*.jpeg"`) do "jpegtran.exe" -optimize -progressive -copy none "%%~i" "%%~i"
               
                rem Оптимизация MP3
                rem mp3packer 2.04
                for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.mp3"`) do "mp3packer64.exe" -f -z -u "%%~i" "%TemporaryName%\%%~i"
                2>nul del /f /q "%TemporaryName%\*.mp3"
               
                rem Оптимизация GIF
                rem gifsicle 1.87 9.Dec.2014 http://www.lcdf.org/gifsicle/
                for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.gif"`) do "gifsicle.exe" --batch --optimize=3 "%%~i"
               
                rem Конвертирование BMP в PNG. Оптимизация PNG
                rem PNGOUT http://advsys.net/ken/utils.htm
                for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.bmp" "*.png"`) do "pngout.exe" "%%~i"
                for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.png"`) do >"%TemporaryName%\%%~i" <"%%~i" "defluff.exe"
                copy /y "%TemporaryName%\*.png" "*.png"
                2>nul del /f /q "%TemporaryName%\*.png"
                "DeflOpt.exe" "*.png"
               
                rem Получаем время работы программы
                "timemer.exe" my_backup view
               
                for /f "usebackq delims=" %%i in (
                        `@"%systemroot%\system32\mshta.exe" "javascript:try {with(new ActiveXObject('Scripting.FileSystemObject')) {GetStandardStream(1).Write(GetFolder('%sSourceFolder:\=\\%').Size - !sPrevFolderSize!)}};catch (e){};close();"`
                ) do set sDifference=%%i
               
                echo Difference after working is [!sDifference!].
               
                rd /s /q "%TemporaryName%"
        ) else (
                echo Can't find folder [%USERPROFILE%\Desktop\Util].
                exit /b 2
        )
       
        popd
) else (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
        setlocal enableextensions enabledelayedexpansion

:NextName
        set sTempName=%temp%\temp%random%.tmp

        if exist "%sTempName%" goto :NextName

        set sProcName=%~0

        endlocal & set %sProcName:~4%=%sTempName%
        exit /b 0
rem ==========================================================================


Не стал делать проверок на существование каждой из утилит.

P.S. Поиски живой «DeflOpt.exe» доставили много незабываемой радости и чистого человеческого счастья ;).

Prog-Man 02-02-2015 16:10 2465278

Вложений: 1
При перетаскивание папки на скрипт все так же закрывается, при запуске через командную строку пишет
непредвиденное появление \common

Iska 02-02-2015 16:42 2465296

Цитата:

Цитата Prog-Man
При перетаскивание папки на скрипт все так же закрывается, »

Он и должен закрываться после исполнения. Это нормально.

Цитата:

Цитата Prog-Man
при запуске через командную строку пишет
непредвиденное появление \common »

Prog-Man, выложенный мною пакетный файл использовался без изменений?

Prog-Man 02-02-2015 17:13 2465315

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

Цитата Iska
Он и должен закрываться после исполнения. Это нормально. »

Закрывается моментально

Цитата:

Цитата Iska
Prog-Man, выложенный мною пакетный файл использовался без изменений? »

Изменений не вносил

Iska 02-02-2015 17:27 2465320

Цитата:

Цитата Prog-Man
Закрывается моментально »

Акцент был на то, что он должен закрываться в принципе.


Цитата:

Цитата Prog-Man
Изменений не вносил »

Буду думать дальше.

Prog-Man 03-02-2015 16:28 2465821

Возможно причина проблемы кроется в переменной PATH

Цитата:

Цитата Iska
PATH %USERPROFILE%\Desktop\Util;%PATH% »

Насколько я понимаю в данной строке используется переменная среда PATH

Iska 03-02-2015 16:33 2465825

Цитата:

Цитата Prog-Man
Насколько я понимаю в данной строке используется переменная среда PATH »

Да, используется.

Цитата:

Цитата Prog-Man
Возможно причина проблемы кроется в переменной PATH »

Например?

Prog-Man 03-02-2015 16:41 2465828

В значение переменной трижды встречается \Common

Prog-Man 06-02-2015 08:52 2467208

Значение переменной
Код:

C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\
После того как я удалил все записи кроме начинающихся на %SystemRoot% скрипт заработал, но не скажется ли удаление записей на работе программ?

Iska 06-02-2015 12:10 2467284

Prog-Man, прошу прощения, пока не успел посмотреть.


Время: 10:16.

Время: 10:16.
© OSzone.net 2001-