Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 4

Автор: king_stiven
Дата сообщения: 14.10.2007 14:02
moonkir
здесь посмотри и
здесь
Автор: moonkir
Дата сообщения: 14.10.2007 14:55
...
Я ненаю как его к своему применить ...
Автор: Tipulatoid
Дата сообщения: 14.10.2007 15:28
to all:
Как известно, команда fsutil fsinfo drives выводит в строку список доступных дисков. Мне его нужно записать в переменную. Однако

Код: for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do set drives=%%b
echo %drives%
Автор: moonkir
Дата сообщения: 14.10.2007 15:52
я как то не уточнил что мне нужен общий прогресс-бар
К примеру у меня есть 318 файлов(в данный момент так), их нужно распаковать.
И отобразить общий процес распаковки прогресс-баром.
На пример квадратными собками в которых 50 символов #
[############################################################]
Тоесть на 318 файлов у нас есть 50 символов. На каждый символ по 6,24 файла. Тоесть коггда распаковалось 6ть (округляю 6,24 до 6) файлов появился один символ
[#===========================================================]
Теперь файлов стало на 6 меньше, тоесть 312 (318-6). Теперь и знаков стало меньше и файлов. На каждый знак приходиться по 6,36 файла. И опять по схема до 6ти округляется и добавляеться один символ, когда распакуеться 6ть файлов.
[##==========================================================]

И так далее, будет четко виден прогресс. И по идее число которое получается при делении кол-ва файлов на 50 символов всегда будет одинаково. И тогда будет четкий прогресс-бар

Извините что так загнул, незнаю как по другому рассказать...
Автор: Elroir
Дата сообщения: 14.10.2007 15:53
Tipulatoid
Даже и не знаю, что в этом случае делать. В выдаваемой строчке, диски отделены не пробелами, а символами конца строки (нулевой символ). Поэтому for и не воспринимает то, что находится после первого диска.
Автор: moonkir
Дата сообщения: 14.10.2007 16:06
Я по поводу своих баранов, фактически нужно подсчитать кол-во файлов и поделить их на 50. Пусть получаемое число будет Х, и после каждых Х обновлений добавлять один символ #. К примеру число Х=2 то вид будет такой:



Код: Распаковывается 1 из ХХ(здесь нужно как то узнавать кол-во обновлений в папке) обновление ХХХХХ.msu...
[============================================================]
Автор: king_stiven
Дата сообщения: 14.10.2007 16:48
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%
Автор: moonkir
Дата сообщения: 14.10.2007 17:47
Ну кол-во думаю обновлений думаю можно так посчитать

dir /b >../list.txt

а потом в листе посчитать кол-во строк... я не наю как строки посчитать
Автор: king_stiven
Дата сообщения: 14.10.2007 17:57

Цитата:
я не наю как строки посчитать


Код:
for /f %%a in ('dir /b') do set /a pusk+=1
echo %pusk%
Автор: moonkir
Дата сообщения: 14.10.2007 18:12
king_stiven
нужно считать из другой папки, а то он и себе считает(батник всмысле)


Код: for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a pusk+=1
echo %pusk%
Автор: king_stiven
Дата сообщения: 14.10.2007 18:30
moonkir
set /a pusk/=50
Ты лучше посчитай, сколько символов в ком строке ### при 100% загрузке ты хочеш видеть. от этого плясать надо.
Автор: moonkir
Дата сообщения: 14.10.2007 18:58
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
Автор: king_stiven
Дата сообщения: 14.10.2007 21:34

Код: @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
)
Автор: moonkir
Дата сообщения: 14.10.2007 22:01
Вопрос решил так:
И %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
Автор: king_stiven
Дата сообщения: 14.10.2007 22:34
moonkir
Смотри предыдущий пост, количество знаков # там прописано 74 в этой строке:
set /a vsego*=74
А вообще у тебя этот скрипт работал? Как то там всё странновато...
операторы goto например, не будут давать делать циклы
Автор: moonkir
Дата сообщения: 14.10.2007 22:56
king_stiven
скрипт это echo !bar! не показывает
Режим вывода команд на экран (ECHO) отключен.

Добавлено:
Да, работал
Автор: king_stiven
Дата сообщения: 14.10.2007 22:59
moonkir
исправил ошибку, ещё проверь
ещё поправил
Автор: moonkir
Дата сообщения: 15.10.2007 00:08
Не, оно убожестевнно получаеться
Автор: king_stiven
Дата сообщения: 15.10.2007 00:51
moonkir
Откуда у тебя пробелы затесались? У меня при проверке их нету.
Вот в эти строки ты пробел не вставил?

Код: if !vsego! GTR !file! (
set bar=!bar!#
set /a file+=1
goto :ert
)
if !vsego! EQU 0 set bar=#
Автор: moonkir
Дата сообщения: 15.10.2007 01:46
Пробелы поубирал, заработало, но блин это мелькание после cls кумарит ппц и пропадет суть самого прогресс бара, не видно где он заканчивается...
Автор: king_stiven
Дата сообщения: 15.10.2007 03:11
подправил прогресс бар, а мелькание попробуй спросить у корифеев: элроира, капралбелла, маза фака.
Автор: moonkir
Дата сообщения: 15.10.2007 08:20
king_stiven
Туперь прогресс-бар вообще не двигается
Автор: king_stiven
Дата сообщения: 15.10.2007 08:41
moonkir
Отправь свой файл по мылу nmusic3@ya.ru
Автор: Maza Faka
Дата сообщения: 15.10.2007 09:20
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
Автор: king_stiven
Дата сообщения: 15.10.2007 09:27
Снова вместо vsego я вставил vsego1 ! Исправлено. А на мелькание оказывают влияние строчки
echo.
Убрал их, гораздо меньше стало.
Автор: moonkir
Дата сообщения: 15.10.2007 09:27
king_stiven
Уф, пришел на работу, работает уже, нужно было пробелы поубирать, на работе процессор слабый - медленно расспаковывает и поэтому не мерцает...
Автор: 01MDM
Дата сообщения: 15.10.2007 09:29
king_stiven
moonkir
На счет мигания могу предложить вот такую идею, как пример:

Код:
@echo off
for /l %%i in (0,1,100) do (
    rem Выполняюся условия, для рассчета прогресс-бара и т.д
title %%i
    set /p="#"<nul
    sleep 1
    )
Автор: moonkir
Дата сообщения: 15.10.2007 09:50
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
)
Автор: moonkir
Дата сообщения: 15.10.2007 12:43
Я вот думаю может как то можно изменять информацию на экране без CLS
Автор: NIKZZZZ
Дата сообщения: 15.10.2007 13:35
moonkir

Цитата:
Я вот думаю может как то можно изменять информацию на экране без CLS

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

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: Доступ к реестру через RegEdit?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.