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

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

Автор: moonkir
Дата сообщения: 15.10.2007 14:23
NIKZZZZ
а чем это нам поможет ?
Автор: 01MDM
Дата сообщения: 15.10.2007 14:23
moonkir
Вот на примере dir /b, можешь переделать под свои нужды, особо не проверял

Код:
@ECHO OFF
cls
echo.
echo Start
echo.
setlocal enabledelayedexpansion
set filecount=0
for /f "delims=" %%i in ('dir /b %systemroot%\system32') do (set /a filecount+=1)
set /a percent=filecount/100
set count=0
set curpercent=0
set step=%percent%
for /f "delims=" %%i in ('dir /b %systemroot%\system32') do (
    set "file=%%i"
    set /a count+=1
    if !count! geq !percent! (
        set /a curpercent+=1
        set /a percent+=step
        for /f %%i in ('echo !curpercent:~-1! ^| findstr "0 2 4 6 8"') do (set /p="#"<nul)
    )
    title Extracting !curpercent!%% : !file!
    ping -n 1 localhost >nul
)
echo.
echo.
echo Finish
echo.
title DONE!
Автор: king_stiven
Дата сообщения: 15.10.2007 14:51
moonkir
Есть такой вариант, прогресс-бар нафик, а проценты писать в заголовке окна бат файла.
Вместо C:\WINDOWS\system32\cmd.exe будет:

1 процентов обновления выполнено
2 процентов обновления выполнено
...
100 процентов обновления выполнено

При этом окно не мигает.

Добавлено:
или даже так:
1% [#----------------------------------------------]
2% [##---------------------------------------------]
...
100% [################################]
Автор: NIKZZZZ
Дата сообщения: 15.10.2007 15:24
moonkir

Цитата:
а чем это нам поможет ?

Не нужно использовать Cls, полоса прогресса будет просто перерисовываться.
Можно так-же этими же утилитами выводить ее без перевода строки (LF), в этом случае она так же будет перерисовываться.
Автор: AndryG
Дата сообщения: 15.10.2007 15:37
Есть утилитка compname - возвращает имя компьютера.
В батнике пишу:
echo 123 compname 456
получаю "123 compname 456"
А хочу "123 S46 456" (s46 -> имя компа )
Я так понял мне нужно использовать "|" ... врожде как каналами это дело называют ... но ничего путнего не получилось.
Подскажите, пжлст ... уж очень не хочется через доп. переменную делать.
Автор: wolf0425
Дата сообщения: 15.10.2007 15:42
AndryG не заморачивайся утилитками, в win2000+ есть встроенная переменная computername, соответственно
echo 123 %computername% 456 напечатает что ты хотел.
Автор: AndryG
Дата сообщения: 15.10.2007 15:46
1. %computername% можно переопределеить
2. Я хочу разобраться с этим делом.
Автор: moonkir
Дата сообщения: 15.10.2007 15:52
king_stiven
Попробовал только что, симпотно получилось если TITLE [!bar!]
Только нада делать вместо ----------------
равно ============
А то в заголовке шрифт другой и не очень получается.
Автор: KapralBel
Дата сообщения: 15.10.2007 15:54
AndryG
echo 123 %computername% 456
Автор: wolf0425
Дата сообщения: 15.10.2007 15:59
AndryG 1. а оно кому-то надо? комп тоже можно переименовать.
2. for /f "delims=" %%a in ('hostname') do echo 123 %%a 456
Автор: AndryG
Дата сообщения: 15.10.2007 16:39
wolf0425 Кажись начало доходить благодарствую.
Автор: king_stiven
Дата сообщения: 15.10.2007 16:58
moonkir

Код: @echo off
setlocal enabledelayedexpansion
for %%a in (*.*) do set /a kolvo+=1
set file=1
set e=1
set "bar=#__________________________________"
For %%F In (*.*) Do (
Set /a N+=1
set vsego=!N!
set Percent=!N!
set /a Percent*=100
set /a Percent/=%kolvo%
set /a vsego*=35
set /a vsego/=%kolvo%
call :tyu
if defined e Title !Percent!^%% [!bar!] > nul
xcopy "%%F" A:\ > nul
set e=
)
GoTo :EOF
:tyu
:ert
if !vsego! GTR !file! (
set "bar=#!bar!"
set /a file+=1
set "bar=!bar:~0,-1!"
set e=1
goto :ert
)
Автор: moonkir
Дата сообщения: 15.10.2007 17:23
king_stiven

Код: @echo off
setlocal enabledelayedexpansion
for %%a in (*.*) do set /a kolvo+=1
set file=1
set e=1
set "bar=#__________________________________"
For %%F In (*.*) Do (
Set /a N+=1
set vsego=!N!
set Percent=!N!
set /a Percent*=100
set /a Percent/=%kolvo%
set /a vsego*=35
set /a vsego/=%kolvo%
call :tyu
if defined e Title !Percent!^%% [!bar!] > nul
xcopy "%%F" A:\ > nul
set e=
)
GoTo :EOF
:tyu
:ert
if !vsego! GTR !file! (
set "bar=#!bar!"
set /a file+=1
set "bar=!bar:~0,-1!"
set e=1
goto :ert
)
Автор: Filosofem
Дата сообщения: 16.10.2007 10:02
подскажите как добавить к имени файла результаты выполнения команд date /t и time /t
например чтобы получилось такое имя: 'archive_16.10.2007_11.02.LOG'
Или может быть есть какие-то спец. переменные с датой и временем?
Автор: AndryG
Дата сообщения: 16.10.2007 10:05
Доброго дня.
Задачка ... нужно реализовать "формочку" ...
"Выключение компа через N секунд. Для отмены нажмите ESC"

Единственное до чего додумался ... через Ctrl-C прерывать выполнение ... hs_readkey не подходит, ибо на нем останавливается выполнение программы.

Есть еще идея запуска доп. окна, в котором ждать нажатие кнопки и создавать файлик, если нажали ... а в основном окне мониторить время или файлик.

Но тоже коряво это всё получается.

Кто что подскажет?
Автор: 01MDM
Дата сообщения: 16.10.2007 10:20
Filosofem

Код:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=." %%i in ('dir /b *.log') do (
    set "new=%%i_%date%_%time:~0,5%.%%j"
    ren %%i.%%j !new::=.!
    )
Автор: Nagual
Дата сообщения: 16.10.2007 11:14
Filosofem

Код: @echo off
for /f "tokens=1-5 delims=:., " %%a in ("%date% %time:~0,6%") do echo 'archive_%%a.%%b.%%c_%%d.%%e.LOG'
Автор: AndryG
Дата сообщения: 16.10.2007 11:43
Nagual спасибо.

Решение подходит ... стыдно, что сам не порылся в shutdown ...

Но хочу вернуться к варианту с клавиатурой ... можно ли как-то ветвление устроить по "нажата или нет кнопка" ... при этом чтобы программа не останавливалась и не ждала нажатия.
Автор: Tipulatoid
Дата сообщения: 16.10.2007 11:46
AndryG

Цитата:
Но хочу вернуться к варианту с клавиатурой ... можно ли как-то ветвление устроить по "нажата или нет кнопка" ... при этом чтобы программа не останавливалась и не ждала нажатия.

Вариант с двумя кнопками (например "С" и "Enter") устроит?
Автор: AndryG
Дата сообщения: 16.10.2007 12:03
Не понял про две кнопки ... но не против посмотреть ...

Уточню на всяк случай ... "нечто" возвращает ноль, если буфер клавиатуры пуст (не нажимали кнопки с момента старта программы или последнего вызова этой команды) или номер нажатой кнопки.

Другими словами программа не должна останавливаться на этой команде.
Автор: Tipulatoid
Дата сообщения: 16.10.2007 12:05
AndryG
Попробуй так:

Код: @echo off
set timer=60
shutdown -s -t %timer% -c "Введите C и Enter в окне командной строки для отмены" -f

:again
cls
set choice=
set /p choice=Введите здесь C и Enter для отмены выключения компьютера
if not defined choice goto again
if /i %choice%==C (
shutdown -a
) else (
goto again
)
Автор: AndryG
Дата сообщения: 16.10.2007 12:17
Написал ... на паскале ...

Код:
uses crt;
var
ch:Char;
begin
if keypressed
then begin
ch := readkey;
halt(ord(ch));
end
else halt(0);
end.
Автор: Nagual
Дата сообщения: 16.10.2007 12:41
AndryG
может ты имеешь в виду это?
немного изменил код Tipulatoid
Код: @echo off
set timer=60
shutdown -s -t %timer% -c "Нажмите клавишу C для отмены" -f
cls
set choice=
set /p choice=Нажмите клавишу C для отмены
if /i %choice%==C (shutdown -a)
Автор: AndryG
Дата сообщения: 16.10.2007 12:46
... нет ... немного не это ... в вашем примере выполнение останавливается на

Код:
set /p choice=Нажмите клавишу C для отмены
Автор: KapralBel
Дата сообщения: 16.10.2007 12:54
AndryG
Т.е. в батнике сделать 2 потока выполнения?
Автор: Maza Faka
Дата сообщения: 16.10.2007 13:39
AndryG
Что то вроде этого?

Код:
@echo off

:_again
set /p ask_="Please respond [Y,N,Q]?"
for %%a in (y n q) do if /i "%ask_%"=="%%a" goto _%%a
goto _again

:_y
echo Your input was Yes& goto :EOF

:_n
echo Your input was No& goto :EOF

:_q
echo Your input was Quit& goto :EOF
endlocal
Автор: Filosofem
Дата сообщения: 16.10.2007 13:44
01MDM
Nagual
Спасибо, идею понял.
Автор: AndryG
Дата сообщения: 16.10.2007 14:48
Maza Faka нет.
Ваш код остановится на set /p ...

Я же хочу такое:

Код:

:begin
echo цикл ...
readkey_ext
if not %errorlevel%==0 if %errorlevel%==27 goto end_loop:
goto begin

:end_loop
Автор: Maza Faka
Дата сообщения: 16.10.2007 15:24
AndryG

Цитата:
Нужно в цикле обработать каждую пару.


Можно так:

Код:
@ECHO OFF

SET VAR=x1-y1-x2-y2-x3-y3

:BEGIN
FOR /F "TOKENS=1* DELIMS=-" %%A IN ('ECHO %VAR%') DO (
ECHO %%A
IF NOT "%%B"=="" (
SET VAR=%%B
GOTO :BEGIN
)
)
Автор: Elroir
Дата сообщения: 16.10.2007 20:43
Maza Faka
В коде из твоего предыдущего поста, лучше сделать "tokens=1,2*" - ему же нужно обрабатывать пары координат.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

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


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