» Задачи на bat-файлах 4
...
Я ненаю как его к своему применить ...
Я ненаю как его к своему применить ...
to all:
Как известно, команда fsutil fsinfo drives выводит в строку список доступных дисков. Мне его нужно записать в переменную. Однако
Код: for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do set drives=%%b
echo %drives%
Как известно, команда fsutil fsinfo drives выводит в строку список доступных дисков. Мне его нужно записать в переменную. Однако
Код: for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do set drives=%%b
echo %drives%
я как то не уточнил что мне нужен общий прогресс-бар
К примеру у меня есть 318 файлов(в данный момент так), их нужно распаковать.
И отобразить общий процес распаковки прогресс-баром.
На пример квадратными собками в которых 50 символов #
[############################################################]
Тоесть на 318 файлов у нас есть 50 символов. На каждый символ по 6,24 файла. Тоесть коггда распаковалось 6ть (округляю 6,24 до 6) файлов появился один символ
[#===========================================================]
Теперь файлов стало на 6 меньше, тоесть 312 (318-6). Теперь и знаков стало меньше и файлов. На каждый знак приходиться по 6,36 файла. И опять по схема до 6ти округляется и добавляеться один символ, когда распакуеться 6ть файлов.
[##==========================================================]
И так далее, будет четко виден прогресс. И по идее число которое получается при делении кол-ва файлов на 50 символов всегда будет одинаково. И тогда будет четкий прогресс-бар
Извините что так загнул, незнаю как по другому рассказать...
К примеру у меня есть 318 файлов(в данный момент так), их нужно распаковать.
И отобразить общий процес распаковки прогресс-баром.
На пример квадратными собками в которых 50 символов #
[############################################################]
Тоесть на 318 файлов у нас есть 50 символов. На каждый символ по 6,24 файла. Тоесть коггда распаковалось 6ть (округляю 6,24 до 6) файлов появился один символ
[#===========================================================]
Теперь файлов стало на 6 меньше, тоесть 312 (318-6). Теперь и знаков стало меньше и файлов. На каждый знак приходиться по 6,36 файла. И опять по схема до 6ти округляется и добавляеться один символ, когда распакуеться 6ть файлов.
[##==========================================================]
И так далее, будет четко виден прогресс. И по идее число которое получается при делении кол-ва файлов на 50 символов всегда будет одинаково. И тогда будет четкий прогресс-бар
Извините что так загнул, незнаю как по другому рассказать...
Tipulatoid
Даже и не знаю, что в этом случае делать. В выдаваемой строчке, диски отделены не пробелами, а символами конца строки (нулевой символ). Поэтому for и не воспринимает то, что находится после первого диска.
Даже и не знаю, что в этом случае делать. В выдаваемой строчке, диски отделены не пробелами, а символами конца строки (нулевой символ). Поэтому for и не воспринимает то, что находится после первого диска.
Я по поводу своих баранов, фактически нужно подсчитать кол-во файлов и поделить их на 50. Пусть получаемое число будет Х, и после каждых Х обновлений добавлять один символ #. К примеру число Х=2 то вид будет такой:
Код: Распаковывается 1 из ХХ(здесь нужно как то узнавать кол-во обновлений в папке) обновление ХХХХХ.msu...
[============================================================]
Код: Распаковывается 1 из ХХ(здесь нужно как то узнавать кол-во обновлений в папке) обновление ХХХХХ.msu...
[============================================================]
Tipulatoid
Код: for /f "tokens=*" %%a in ('fsutil fsinfo drives ^| find "\"') do set drives1=!drives1! %%a
for /f "tokens=1*" %%a in ("!drives1!") do set drives=%%b
echo %drives%
Код: for /f "tokens=*" %%a in ('fsutil fsinfo drives ^| find "\"') do set drives1=!drives1! %%a
for /f "tokens=1*" %%a in ("!drives1!") do set drives=%%b
echo %drives%
Ну кол-во думаю обновлений думаю можно так посчитать
dir /b >../list.txt
а потом в листе посчитать кол-во строк... я не наю как строки посчитать
dir /b >../list.txt
а потом в листе посчитать кол-во строк... я не наю как строки посчитать
Цитата:
я не наю как строки посчитать
Код:
for /f %%a in ('dir /b') do set /a pusk+=1
echo %pusk%
king_stiven
нужно считать из другой папки, а то он и себе считает(батник всмысле)
Код: for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a pusk+=1
echo %pusk%
нужно считать из другой папки, а то он и себе считает(батник всмысле)
Код: for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a pusk+=1
echo %pusk%
moonkir
set /a pusk/=50
Ты лучше посчитай, сколько символов в ком строке ### при 100% загрузке ты хочеш видеть. от этого плясать надо.
set /a pusk/=50
Ты лучше посчитай, сколько символов в ком строке ### при 100% загрузке ты хочеш видеть. от этого плясать надо.
king_stiven
я уже написал, 50, но в принцыпе можно любое кол-во
Добавлено:
Хорошо получаем мы число pusk
Как теперь отсчитывать кол-во (set /a pusk/=50)распакованых обновлений
Добавлено:
хм... если... вроде понял, щас попробую
Добавлено:
щас у меня вот так выглядит
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolvo+=1
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolv+=1
set /a kolv/=74
Set /a N=0
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
cls
Set /a N+=1
echo -=Распаковка обновлений=-
echo.
echo Распаковывается %N% из %kolvo% обновлений
echo %1 ...
echo.
:: вот на этом месте я думаю нужно сравнивать переменные
:: если %N% деленное на %kolv% равно 1 то одна решетка #
:: [#===================================================================================]
:: если %N% деленное на %kolv% равно 2 то две решетки ##
:: [##==================================================================================]
:: ну и так далее, а вот как написать ненаю
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
exit
я уже написал, 50, но в принцыпе можно любое кол-во
Добавлено:
Хорошо получаем мы число pusk
Как теперь отсчитывать кол-во (set /a pusk/=50)распакованых обновлений
Добавлено:
хм... если... вроде понял, щас попробую
Добавлено:
щас у меня вот так выглядит
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolvo+=1
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolv+=1
set /a kolv/=74
Set /a N=0
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
cls
Set /a N+=1
echo -=Распаковка обновлений=-
echo.
echo Распаковывается %N% из %kolvo% обновлений
echo %1 ...
echo.
:: вот на этом месте я думаю нужно сравнивать переменные
:: если %N% деленное на %kolv% равно 1 то одна решетка #
:: [#===================================================================================]
:: если %N% деленное на %kolv% равно 2 то две решетки ##
:: [##==================================================================================]
:: ну и так далее, а вот как написать ненаю
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
exit
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f %%a in ('dir msu /b') do set /a kolvo+=1
set file=1
set "bar=#-------------------------------------------------------------------------"
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
Set /a N+=1
set "vsego=!N!"
set /a vsego*=74
set /a vsego/=%kolvo%
call :tyu
cls
echo -=Распаковка обновлений=-
echo Распаковывается !N! из %kolvo% обновлений
echo %1 ...
echo !bar!
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
exit
GoTo :EOF
:tyu
:ert
if !vsego! GTR !file! (
set "bar=#!bar!"
set /a file+=1
set "bar=!bar:~0,-1!"
goto :ert
)
Вопрос решил так:
И %N% не меняется
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolvo+=1
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolv+=1
set /a kolv/=74
Set /a N=0
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
cls
Set /a N+=1
echo -=Распаковка обновлений=-
echo.
echo Распаковывается %N% из %kolvo% обновлений
echo %1 ...
echo.
set /a T=%N%
set /a T/=%kolv%
::Теперь к цифре получаемой из %T% нужно привязать кол-во символов # (кол-во символов # равно %Т%)
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
exit
И %N% не меняется
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolvo+=1
for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolv+=1
set /a kolv/=74
Set /a N=0
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
cls
Set /a N+=1
echo -=Распаковка обновлений=-
echo.
echo Распаковывается %N% из %kolvo% обновлений
echo %1 ...
echo.
set /a T=%N%
set /a T/=%kolv%
::Теперь к цифре получаемой из %T% нужно привязать кол-во символов # (кол-во символов # равно %Т%)
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
exit
moonkir
Смотри предыдущий пост, количество знаков # там прописано 74 в этой строке:
set /a vsego*=74
А вообще у тебя этот скрипт работал? Как то там всё странновато...
операторы goto например, не будут давать делать циклы
Смотри предыдущий пост, количество знаков # там прописано 74 в этой строке:
set /a vsego*=74
А вообще у тебя этот скрипт работал? Как то там всё странновато...
операторы goto например, не будут давать делать циклы
king_stiven
скрипт это echo !bar! не показывает
Режим вывода команд на экран (ECHO) отключен.
Добавлено:
Да, работал
скрипт это echo !bar! не показывает
Режим вывода команд на экран (ECHO) отключен.
Добавлено:
Да, работал
moonkir
исправил ошибку, ещё проверь
ещё поправил
исправил ошибку, ещё проверь
ещё поправил
Не, оно убожестевнно получаеться
moonkir
Откуда у тебя пробелы затесались? У меня при проверке их нету.
Вот в эти строки ты пробел не вставил?
Код: if !vsego! GTR !file! (
set bar=!bar!#
set /a file+=1
goto :ert
)
if !vsego! EQU 0 set bar=#
Откуда у тебя пробелы затесались? У меня при проверке их нету.
Вот в эти строки ты пробел не вставил?
Код: if !vsego! GTR !file! (
set bar=!bar!#
set /a file+=1
goto :ert
)
if !vsego! EQU 0 set bar=#
Пробелы поубирал, заработало, но блин это мелькание после cls кумарит ппц и пропадет суть самого прогресс бара, не видно где он заканчивается...
подправил прогресс бар, а мелькание попробуй спросить у корифеев: элроира, капралбелла, маза фака.
king_stiven
Туперь прогресс-бар вообще не двигается
Туперь прогресс-бар вообще не двигается
moonkir
Отправь свой файл по мылу nmusic3@ya.ru
Отправь свой файл по мылу nmusic3@ya.ru
king_stiven
Tipulatoid
Можно проще:
Код:
@ECHO OFF
FOR /f "tokens=*" %%a in ('fsutil fsinfo drives ^| FIND /v ""') do CALL :_comp "%%a"
ECHO %drives%
GOTO :EOF
:_comp
SET drives=%drives%%~1
Tipulatoid
Можно проще:
Код:
@ECHO OFF
FOR /f "tokens=*" %%a in ('fsutil fsinfo drives ^| FIND /v ""') do CALL :_comp "%%a"
ECHO %drives%
GOTO :EOF
:_comp
SET drives=%drives%%~1
Снова вместо vsego я вставил vsego1 ! Исправлено. А на мелькание оказывают влияние строчки
echo.
Убрал их, гораздо меньше стало.
echo.
Убрал их, гораздо меньше стало.
king_stiven
Уф, пришел на работу, работает уже, нужно было пробелы поубирать, на работе процессор слабый - медленно расспаковывает и поэтому не мерцает...
Уф, пришел на работу, работает уже, нужно было пробелы поубирать, на работе процессор слабый - медленно расспаковывает и поэтому не мерцает...
king_stiven
moonkir
На счет мигания могу предложить вот такую идею, как пример:
Код:
@echo off
for /l %%i in (0,1,100) do (
rem Выполняюся условия, для рассчета прогресс-бара и т.д
title %%i
set /p="#"<nul
sleep 1
)
moonkir
На счет мигания могу предложить вот такую идею, как пример:
Код:
@echo off
for /l %%i in (0,1,100) do (
rem Выполняюся условия, для рассчета прогресс-бара и т.д
title %%i
set /p="#"<nul
sleep 1
)
king_stiven
Добавлено:
01MDM
подскажите как примень к скрипту:
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f %%a in ('dir msu /b') do set /a kolvo+=1
set file=1
set "bar=--------------------------------------------------------------------------"
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
Set /a N+=1
set "vsego=!N!"
set /a vsego*=75
set /a vsego/=%kolvo%
call :tyu
cls
echo -=Распаковка обновлений=-
echo.
echo Распаковывается !N! из %kolvo% обновлений
echo %1 ...
echo.
echo [!bar!]
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
pause
exit
GoTo :EOF
:tyu
:ert
if !vsego! GTR !file! (
set "bar=#!bar!"
set /a file+=1
set "bar=!bar:~0,-1!"
goto :ert
)
Добавлено:
01MDM
подскажите как примень к скрипту:
Код: @ECHO OFF
setlocal enabledelayedexpansion
:Extract
for /f %%a in ('dir msu /b') do set /a kolvo+=1
set file=1
set "bar=--------------------------------------------------------------------------"
echo.
cd msu
For %%F In ("*.msu") Do Call :Ext %%F
goto Exit
:Ext
Set /a N+=1
set "vsego=!N!"
set /a vsego*=75
set /a vsego/=%kolvo%
call :tyu
cls
echo -=Распаковка обновлений=-
echo.
echo Распаковывается !N! из %kolvo% обновлений
echo %1 ...
echo.
echo [!bar!]
if defined updall goto continue
if exist "..\Cab\%~n1.cab" (
echo.
echo Обновление с таким именем уже существует
:Choice
echo.
set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
echo.
if "!choice:~0,1!"=="o" goto continue
if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
if "!choice:~0,1!"=="s" goto :EOF
goto :Choice
)
:continue
call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
::Удаление лишних файлов
del /f /q "..\Cab\*.xml" > nul
del /f /q "..\Cab\*.txt" > nul
del /f /q "..\Cab\WSUSSCAN.cab" > nul
GoTo :EOF
:Exit
pause
exit
GoTo :EOF
:tyu
:ert
if !vsego! GTR !file! (
set "bar=#!bar!"
set /a file+=1
set "bar=!bar:~0,-1!"
goto :ert
)
Я вот думаю может как то можно изменять информацию на экране без CLS
moonkir
Цитата:
В шапке в "полезных утилитах" есть Пакет утилит для организации интерфейса, в нем, насколько помню, есть возможность установки позиции курсора.
Цитата:
Я вот думаю может как то можно изменять информацию на экране без CLS
В шапке в "полезных утилитах" есть Пакет утилит для организации интерфейса, в нем, насколько помню, есть возможность установки позиции курсора.
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
Предыдущая тема: Доступ к реестру через RegEdit?
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.