Ru-Board.club
← Вернуться в раздел «Программы»

» Командная строка, батники, сценарии (bat, cmd)

Автор: YuS_two
Дата сообщения: 13.06.2016 15:49
boss911

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

Тогда путь один: его подсказал уже metatrop. Распространять придется вместе со сценарием...
Утилиту лучше искать у автора


Цитата:
Интересная, но ничего общего с назначением cmd не имеющая.

Согласен полностью, cmd хорош в рамках только тех целей, для которых создавался, пусть и не всегда хватает функционала. А для чего-то большего... хоть и возможно, но непрактично и трудозатратно...
Автор: boss911
Дата сообщения: 13.06.2016 17:01
Определенная команда выводит информацию (выхлоп), например, в 200 строк (с учетом пустых). Как сделать, чтобы вывод выхлопа разбивался на 30 строк, а между ними PAUSE (30 -> пауза -> следующие 30 и т.д.). На крайний случай, вывод остальных/последних (170) строк пусть перенаправляется в MORE. Вывод должен происходить без обрезки пустых строк и хотелось бы без создания временных файлов. Ничего из этого у меня не получается.
Автор: GCRaistlin
Дата сообщения: 13.06.2016 17:24
boss911
Чем перенаправление в MORE не устраивает?


Цитата:
Ничего из этого у меня не получается.

А вы показывайте свой вариант. Естественно, выбрасывая все не относящееся к делу и заменяя специфические команды на обычные (ту же "dir c:\ /s" для эмуляции длинного вывода).
Автор: boss911
Дата сообщения: 13.06.2016 17:45
GCRaistlin

Цитата:
Чем перенаправление в MORE не устраивает?

Если так:

Код: MODE CON COLS=90 LINES=38
ECHO Message...
dir /s %ProgrammFiles% | MORE
Автор: YuS_two
Дата сообщения: 13.06.2016 18:42
boss911

Цитата:
А вот если бы сначала можно было бы вывести 30 строк, было бы то, что надо.


Цитата:
Свой бы (кастомный) MORE был бы лучше, как по мне, где можно было бы управлять количеством выводов строк.


Код: @echo off
echo Message.....
set cnt=0
for /f "delims=" %%i in ('dir /b/s c:\TEST') do call :mo "%%i"
pause&&exit
:mo
set /a cnt+=1
echo "%~1"
if %cnt% gtr 30 (set cnt=0&&pause)
exit /b
Автор: GCRaistlin
Дата сообщения: 13.06.2016 18:46

Цитата:
убивает "Message...", ибо заполняет все 38 строк

Засуньте все команды, чей вывод не должен уплывать бесконтрольно за пределы экрана, в подпрограмму, и вызывайте ее из перезапускаемой копии скрипта, вывод которой уже перенаправляйте MORE.

Цитата:
Указывал уже

Нет, это не годится. Во-первых, примеры должны быть рабочими. Что такое "Commands"? Во-вторых, вы спросили совета, вам его дали - так перепишите свои скрипты в соответствии с советом. А я не вижу в этих примерах реализации моего последнего совета.
Автор: boss911
Дата сообщения: 14.06.2016 00:33
YuS_two

Спасибо, то, что нужно, но есть нюанс и пожелание. Без использования метки можно? Выхлоп 'dir /s c:\test' внутри скобок FOR выходит без учета пустых строк, можно сделать, чтобы пустые строки отображались, чтобы форматирование выхлопа было точно такое же, как будто мы набрали и выполнили эту команду в CMD? В хелпе для FOR /F говорится, что пустые строки пропускаются, чего мне совсем не нужно.
Автор: YuS_two
Дата сообщения: 14.06.2016 06:46
boss911

Цитата:
В хелпе для FOR /F говорится, что пустые строки пропускаются, чего мне совсем не нужно.

Ну, с форматированием в cmd бяда, выбор невелик... но тут либо ехать, либо выбирать что-то более подходящее... например, powershell...
А чем не подходит вариант с паузой после мессэджа, но перед выводом с морем? Вполне читабельно же.
Автор: boss911
Дата сообщения: 14.06.2016 08:12
YuS_two

Цитата:
А чем не подходит вариант с паузой после мессэджа, но перед выводом с морем?

Задача показать в окне свой мессэдж и выхлоп от команды, если вывод выхлопа будет с морем, то мой мессэдж уплывет. Вызвать метку с морем нельзя? В метке будет мой мессэдж и команда с большим выводом текста. Либо придется перезапускать батник с выводом его в море, как предложил GCRaistlin, но оно как-то странно у меня работает.
Автор: YuS_two
Дата сообщения: 14.06.2016 10:20
boss911

Цитата:
Задача показать в окне свой мессэдж и выхлоп от команды, если вывод выхлопа будет с морем, то мой мессэдж уплывет.

Ну так я и спрашиваю:

Код: @echo off&&echo.&&echo Message Attention!!!&&echo.&&echo.&&pause&&dir /s %systemroot%|more
Автор: boss911
Дата сообщения: 14.06.2016 11:17
YuS_two

Цитата:
Читаем сообщение, жмем аникей, любуемся на море...

Нужно вывести сообщение и выхлоп, то и другое должно быть на экране одновременно, а не одно за другим через паузу. PowerShell не для ХР. Короче, ситуация ясна, как хотелось не получается.
Автор: YuS_two
Дата сообщения: 14.06.2016 12:22
boss911

Цитата:
то и другое должно быть на экране одновременно

Это в смысле "хочу и всё тут"? Лично я не представляю по какой технической причине может возникнуть такое требование.
Говорю же, если хочется шашечек, то cmd - плохой помощник в этом.

Цитата:
PowerShell не для ХР.

Ошибочное мнение = глубокое заблуждение.
Здесь подтверждение моего утверждения
Но это уже не в рамках этого топика надо обсуждать.
Автор: boss911
Дата сообщения: 14.06.2016 15:02
Нужна помощь, плиз, если что сильно не обижайте.

Код: @Echo off

CALL :ChoiceMenu

CLS & ECHO %Index%
ECHO. & PAUSE & EXIT

:ChoiceMenu
CLS & ECHO.
ECHO Message...
SET /P CHOICE="Enter index number or "*" => "
FOR /L %%I IN (1,1,99) DO IF "%%I"=="%CHOICE%" (SET Index=%CHOICE%) ELSE (GOTO:ChoiceMenu)
GOTO:EOF
Автор: YuS_two
Дата сообщения: 14.06.2016 15:48
boss911

Код: @echo off
CALL :ChoiceMenu

CLS & ECHO %Index%
ECHO. & PAUSE & EXIT

:ChoiceMenu
CLS & ECHO.
ECHO Message...
SET /P CHOICE="Enter index number or "*" => "
FOR /L %%I IN (1,1,99) DO IF "%%I"=="%CHOICE%" (SET Index=%CHOICE%&&exit /b)
if "*"=="%CHOICE%" SET Index=%CHOICE%&&exit /b
GOTO :ChoiceMenu
Автор: boss911
Дата сообщения: 14.06.2016 18:01
YuS_two

Вот как оно оказывается. Спасибо.

[more]
Цитата:
Ошибочное мнение = глубокое заблуждение.

Я про то, что PowerShell нет в составе ХР, а батник будет запускаться на разных машинах, работа батника не должна зависить от наличия определенного ПО в ОС, он должен быть универсальным. Не буду же я вместе с батником тягать инсталл PowerShell'а.[/more]
Автор: MisHel64
Дата сообщения: 15.06.2016 19:26

Цитата:
Нужно вывести сообщение и выхлоп, то и другое должно быть на экране одновременно, а не одно за другим через паузу. Короче, ситуация ясна, как хотелось не получается.
boss911 Отправляешь "сообщение" во временный файл. Туда же отправляешь "выхлоп", и выводишь полученный файл через MORE.
Автор: boss911
Дата сообщения: 25.06.2016 15:43
[more]
Код: FOR /F "Tokens=1* Delims==" %%A IN ('SET Line') DO CALL:MORE "%%B"

:MORE
SET /A CNT+=1
@ECHO.%~1
IF %CNT% GTR 29 (SET CNT=0 & ECHO. & PAUSE & CLS)
GOTO:EOF
Автор: YuS_two
Дата сообщения: 25.06.2016 17:44
boss911

Цитата:
Если можно, без дополнительных меток в данном примере.

Каких меток? Тут впору ещё один цикл запускать для предварительного расчета общего количества строк, а потом уже условный блок прикручивать...
Надо бы как-то повнятнее условия описать... а то не очень понятно, что требуется в итоге.
Типа:
Считаем строки в общем количестве = n
Вывод n строк и больше - выполняем то-то
Вывод меньше n строк - выполняем это...

Без всяких случаев, только это описание...
Автор: boss911
Дата сообщения: 25.06.2016 18:32
YuS_two

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

Если выхлоп из FOR имеет ровно или менее 30 строк, тогда выводим их и потом ECHO =<30.
Если выхлоп из FOR имеет больше 30 строк, после 30-й выполняем pause и clc и так каждый раз после каждой 30-й строки, то есть разбиваем выхлом на блоки по 30 строк.
Автор: YuS_two
Дата сообщения: 25.06.2016 20:23
boss911

Цитата:
Если выхлоп из FOR имеет ровно или менее 30 строк, тогда выводим их и потом ECHO =<30.
Если выхлоп из FOR имеет больше 30 строк, после 30-й выполняем pause и clc и так каждый раз после каждой 30-й строки, то есть разбиваем выхлом на блоки по 30 строк.

Вообще-то этот цикл так и работает, как Вы желаете. У меня ведь было проверочное число на 30 строк, а у Вас 29 и удалена команда выхода после цикла, т.е. Вы получаете один лишний проход... и неправильную работу кода.
Надо так:
Ваш код с поправкой:

Код: FOR /F "Tokens=1* Delims==" %%A IN ('SET Line') DO CALL:MORE "%%B"
echo.
echo "END lines"
timeout 3&&exit

:MORE
SET /A CNT+=1
@ECHO.%~1
IF %CNT% GTR 29 (SET CNT=0 & ECHO. & PAUSE & CLS)
GOTO:EOF
Автор: boss911
Дата сообщения: 26.06.2016 01:12
YuS_two

К сожалению, так не получается, я так уже пробовал. Дело в том, что при GTR 30 вывод из FOR будет состоять из 31 строки, а мне надо СТРОГО 30 и НЕ больше, вот почему в моем в коде GTR 29. FOR выводит 30-ю строку, GTR 29 это фиксирует и ставит на паузу. Именно так у меня GTR работает. И я повторюсь, если выхлоп из FOR состоит только из 30 строк или менее, то паузу после 30-й ставить не надо.

Видимо вы изначально были правы. Сначала нужно выяснить, подсчитать количество выводимых строк. Если N строк равно или менее 30, то просто их выводим и потом echo "=<30". Если N строк больше 30, тогда выводим по 30 строк с паузой между каждыми 30 строк. Как-то так, суть такова, но вам виднее, как осуществить.


Цитата:
Тут другое непонятно - отчего такая нелюбовь к ним?

Мой основной код и так содержит метки, все по своим группам (для личного удобства), не люблю, когда метка и внутри еще одна (пирамида), а если будет метка внутри ней еще одна и в ней еще одна, такой матрешности я не "переживу". Это больше для личной эстетики.
Автор: YuS_two
Дата сообщения: 26.06.2016 03:52
boss911

Цитата:
К сожалению, так не получается, я так уже пробовал. Дело в том, что при GTR 30 вывод из FOR будет состоять из 31 строки, а мне надо СТРОГО 30 и НЕ больше, вот почему в моем в коде GTR 29. FOR выводит 30-ю строку, GTR 29 это фиксирует и ставит на паузу. Именно так у меня GTR работает. И я повторюсь, если выхлоп из FOR состоит только из 30 строк или менее, то паузу после 30-й ставить не надо.

А, ну да, если надо строго n строк, то в счетчике необходимо после вывода строки делать проверку на число n-1, ведь там стоит проверка на "больше", а 30 строк уже выведено и если число будет 30, то будет вывод и 31 строки с последующей проверкой по условию...

Так, кажется дошло, что требуется: Необходимо делать паузу после каждых 30 строк, но если ровно 30 строк в тексте последние, то дополнительную паузу
не выводить - так? Если да, то:

Код: FOR /F "Tokens=1* Delims==" %%A IN ('SET Line') DO CALL:MORE "%%B"
echo.
echo "END lines"
timeout 3&&exit

:MORE
IF %CNT% GTR 29 (SET CNT=0 & ECHO. & PAUSE & CLS)
SET /A CNT+=1
@ECHO.%~1
GOTO:EOF
Автор: boss911
Дата сообщения: 26.06.2016 04:38
YuS_two

Если вы не против, давайте перейдем в ПМ, а то мы тут долго еще будем обсуждать. Сейчас напишу более подробно и что там будет выводиться.
Автор: YuS_two
Дата сообщения: 26.06.2016 05:38
boss911

Цитата:
Если вы не против, давайте перейдем в ПМ, а то мы тут долго еще будем обсуждать.

Вроде бы, ПМ уже не требуется... до меня дошло то, что требовалось Предыдущий свой пост подкорректировал.
Автор: YuS_two
Дата сообщения: 26.06.2016 10:59
Окончательный вариант почти универсальной замены more, для вывода текста:
Преимущества:
1. Возможность выбора количества выводимых строк на один экран.
2. Возможность добавления пустых строк через заданное количество непустых.
3. Возможность добавления дополнительного сообщения перед выводом текста.
4. А что ещё надо?


Код: @echo off
rem v 1.2(c)YuS
echo.&echo Message...&echo.
rem Всего выводимых строк:
set lin=30
rem Количество непустых строк, после которых добавляем пустую строку:
set /a sp=5
rem Инициализация переменных для счетчика:
set /a m=lin-1, i=0, cnt=0
if %sp%==0 (set st=-1) else (set st=%sp%)
rem Вывод строк:
for /f "delims=" %%b in ('type text.txt') do call :MORE "%%b"
echo.
echo "END lines"
timeout 5&&goto EOF
:MORE
if %i%==%st% (echo.&set /a cnt+=1&set i=0)
if %cnt% gtr %m% (set cnt=0&echo.&pause&cls)
echo.%~1
set /a cnt+=1
set /a i+=1
exit /b
Автор: Fossyara
Дата сообщения: 26.06.2016 22:24
Есть дос флэшка, с неё нужно прошить биос видеокарты
Код: atiflash -f -p 0 290.rom
Автор: YuS_two
Дата сообщения: 27.06.2016 04:43
Fossyara

Цитата:
Есть дос флэшка


Цитата:
клавиатуры нет, только мышка.

А клавиатуру мышь съела? шутка
Если нет клавиатуры, а флеш загрузочная и именно dos, тогда поместите в корень файл autoexec.bat и пропишите требуемые команды в него...
Автор: Fossyara
Дата сообщения: 27.06.2016 13:02
YuS_two
Благодарю
Автор: tdmods
Дата сообщения: 03.07.2016 17:33
Народ мне подсказка. Нужно bat составить или что то подобное:
1) Проверяем жив ли процесс.
2) Если жив, то ничего не делаем.
3) Если не жив, то проверяем живы ли еще два процесса.
4) Если оба процесса живы, то подождать 60 секунд и убить оба процесса.
Автор: king_stiven
Дата сообщения: 03.07.2016 22:40
tdmods
tasklist| 1>nul 2>nul find "cmd.exe" || tasklist| 1>nul 2>nul find "calc.exe" && tasklist| 1>nul 2>nul find "notepad.exe" && sleep 60 && 1>nul Taskkill /F /IM notepad.exe /IM calc.exe

Пауза здесь sleep 60 , если такой команды нет, то парни подскажут и в шапке были паузы.

Страницы: 1234567

Предыдущая тема: Дубль


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