Показать полную графическую версию : требуется найти разницу в размере папки до работы скрипта и после
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
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
Замените:
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 тоже заменить?
Вместо «cd %1» должно быть «cd /d "%sSourceFolder%"». И не в начале пакетного файла, а в том месте, где зелёным по голубому написано «Здесь начинается Ваш код»/«Здесь заканчивается Ваш код».
:: Где то после этого момента вылетает »
До или после вывода «Previously size […].»? Как именно «вылетает»?
%~1 тоже заменить? »
Да.
Prog-Man
24-01-2015, 10:28
До или после вывода «Previously size […].»? Как именно «вылетает»? »
Закрывается до вывода «Previously size […].»
Ух. Покажите получившийся у Вас код.
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
Самое интересное, что даже этот скрипт стал закрываться
Самое интересное, что даже этот скрипт стал закрываться »
Замените в:
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
Теперь окно закрывается сразу после
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
Я ведь просил сначала запустить командную строку, затем исполнить в ней пакетный файл. »
Про командную строку пропустил.
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
При перетаскивание папки на скрипт все так же закрывается, »
Он и должен закрываться после исполнения. Это нормально.
при запуске через командную строку пишет
непредвиденное появление \common »
Prog-Man, выложенный мною пакетный файл (http://forum.oszone.net/post-2464987.html#post2464987) использовался без изменений?
Prog-Man
02-02-2015, 17:13
Он и должен закрываться после исполнения. Это нормально. »
Закрывается моментально
Prog-Man, выложенный мною пакетный файл использовался без изменений? »
Изменений не вносил
Закрывается моментально »
Акцент был на то, что он должен закрываться в принципе.
Изменений не вносил »
Буду думать дальше.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.