PDA

Показать полную графическую версию : требуется найти разницу в размере папки до работы скрипта и после


Страниц : [1] 2

Prog-Man
24-01-2015, 05:22
Здравствуйте! Собственно все написано в теме.
Нашел две программы выводящие размер папки, но не знаю как получить эти данные в виде переменной.

Disk Usage
https://technet.microsoft.com/en-us/sysinternals/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/library/cc786699(WS.10).aspx

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

Iska
24-01-2015, 07:26
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
Вот мой скрипт(сильно не пинайте это мой первый скрипт).

@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
Замените:
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
::@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!].


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

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

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

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

Prog-Man
24-01-2015, 10:28
До или после вывода «Previously size […].»? Как именно «вылетает»? »
Закрывается до вывода «Previously size […].»

Iska
24-01-2015, 10:55
Ух. Покажите получившийся у Вас код.

Prog-Man
24-01-2015, 10:58
@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
@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
Самое интересное, что даже этот скрипт стал закрываться »
Замените в:
set sSourceFolder=E:\Песочница\0425
«E:\Песочница\0425» на путь к Вашей папке, сохраните в файл с расширением «.cmd» в кодировке OEM/866, запустите командную строку, исполните в ней данный пакетный файл, сделайте скриншот данного окна командной строки («Alt-PrintScreen»), выложите скриншот сюда.

Prog-Man
26-01-2015, 09:17
Теперь окно закрывается сразу после

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

Prog-Man
26-01-2015, 09:41
Похоже эта проблема как-то связана с Internet Explorer

Iska
01-02-2015, 06:27
Теперь окно закрывается сразу после
echo bla-bla-bla
echo bla-bla-bla
echo bla-bla-bla
rem Здесь заканчивается Ваш код

Изображения Тип файла: png 2.png »
Похоже эта проблема как-то связана с Internet Explorer »
Мне кажется, что эта проблема как-то связана с не только с IE, но и с тем, что Вы делаете не совсем то, что я прошу:
Замените в:
set sSourceFolder=E:\Песочница\0425
«E:\Песочница\0425» на путь к Вашей папке, сохраните в файл с расширением «.cmd» в кодировке OEM/866, запустите командную строку, исполните в ней данный пакетный файл, сделайте скриншот данного окна командной строки («Alt-PrintScreen»), выложите скриншот сюда. »
Я ведь просил сначала запустить командную строку, затем исполнить в ней пакетный файл. В какое место кода Вы добавили «pause»?

Prog-Man
01-02-2015, 14:24
Я ведь просил сначала запустить командную строку, затем исполнить в ней пакетный файл. »
Про командную строку пропустил.

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

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

Я понимаю, что Вы явно руководствовались этим: How to Automate PNG & JPG Image Optimization in Windows - Station Four Blog (http://blog.stationfour.com/automating-png-jpg-image-optimization-in-windows/) кодом, но в реальности нет никакой нужды использовать промежуточные файлы. Убрал.

Нет никакой нужды в принудительном задании числа 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.
Убрал.

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

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


Так и не понял, зачем Вы проделываете двойную оптимизацию над 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
При перетаскивание папки на скрипт все так же закрывается, при запуске через командную строку пишет
непредвиденное появление \common

Iska
02-02-2015, 16:42
При перетаскивание папки на скрипт все так же закрывается, »
Он и должен закрываться после исполнения. Это нормально.

при запуске через командную строку пишет
непредвиденное появление \common »
Prog-Man, выложенный мною пакетный файл (http://forum.oszone.net/post-2464987.html#post2464987) использовался без изменений?

Prog-Man
02-02-2015, 17:13
Он и должен закрываться после исполнения. Это нормально. »
Закрывается моментально

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

Iska
02-02-2015, 17:27
Закрывается моментально »
Акцент был на то, что он должен закрываться в принципе.

Изменений не вносил »
Буду думать дальше.




© OSzone.net 2001-2012