[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 2 месяца
  • Сообщений: 578
  • Репутация:24

    [+] [-]
82438ну так мне нужна возможность выбрать несколько вариантов (группы команд не противоречат друг другу, просто могут понадобиться разные сочетания).
ну тогда не понимаю
82430хочется чтобы пауза была только если были выбраны правильные варианты и вополнены соответствующие команды

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
loban_ser,
нужно:
1) выбран один или несколько вариантов - выполняются соответствующие группы команд, в конце пауза.
2) не выбран вариант (просто нажат Enter) или введено что-то другое - возврат в начало
...
добавлять паузу в конце команд каждого варианта - не подходит, так как в случае мультивыбора следующая группа команд сама не запустится.. нужна пауза только в самом конце.
пауза в том месте, где она у меня сейчас не такая уж и проблема, просто не хотелось чтобы она маячила в случае ввода неверного варианта.
...
пробовал немного изменить скрипт:
при совпадении значения переменной не выполнять вызов соответствующей метки (call :...) а записывать в переменную, а уже потом, после цикла выполнить... но что-то не срослось ba ...
да в принципе фиг с ней, с паузой.. мне важнее было убедиться что в целом реализация приемлема. или можно иначе сделать

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 2 месяца
  • Сообщений: 578
  • Репутация:24

    [+] [-]
cartmenezz,
запуск выполнения команд
Например: 1 2 3 4 5
Например: 1-5
@echo off
:start
set var=
cls
echo.
echo. 1 - comand 1
echo. 2 - comand 2
echo. 3 - comand 3
echo. 4 - comand 4
echo. 5 - end
echo.
set /p "var= Your choice: "
if "%var%"=="" goto :start
echo.
set _end=null
for /f "tokens=2 delims=-" %%i in ('echo %var%') do set _end=%%i
if not %_end%==null goto :22
FOR %%i IN (%var%) DO (
  call :%%i
  echo.
)
pause
goto :start
:22
for /f "tokens=1 delims=-" %%i in ('echo %var%') do set _start=%%i
for /f "tokens=2 delims=-" %%i in ('echo %var%') do set _end=%%i
for /L %%i in (%_start%, 1, %_end%) do (
  call :%%i
  echo.
)
pause
goto :start
:1
echo.
echo comand 1
exit /b
:2
echo.
echo comand 2
exit /b
:3
echo.
echo comand 3
exit /b
:4
echo.
echo comand 4
exit /b
:5
echo.
echo the end
timeout /t 3 >nul
exit

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
loban_ser, Большое спасибо, ваш вариант конечно поинтереснее.
Ввод диапазона вариантов (через дефис) даже не рассматривал, надо будет взять на вооружение. В этом конкретном случае, правда, не пригодится, так как варианты планирую разбить по смысловым группам с чуть разной нумерацией (01,02,03.. 11,12,13.. 21,22,23.. и т.д.). Но введение доп-х переменных, проверка их значений на соответствие меткам - это я наверное перемудрил, сделаю как у Вас - это и проще и информативнее, так как при неправильном вводе варианта будет вывод ошибки об отсутвии метки. Я понял что зря добавлял проверку введенных значений (в том виде как у меня получилось) - при таком раскладе не будет попытки перейти на несуществующую метку, не будет ошибки, но наверное это скорее плохо, чем хорошо - так как можно и не узнать что какое-то действие не было выполнено. А увидев по окончании что была ошибка, можно будет повторно запустить пункт в котором допущена опечатка.
В общем, БОЛЬШОЕ спасибо за помощь))

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 2 месяца
  • Сообщений: 578
  • Репутация:24

    [+] [-]
cartmenezz,
запускать можно в любом порядке: 1 4 2 5 3 именно в этом порядке и будут выполнятся команды
через дефис это диапазон т.е например 1-4 команды будут выполнятся от 1 до 4 последовательно

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
loban_ser, это я понял, благодарю)

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Приветствую aa
снова я за советом... вроде бы разобрался, но что-то уверенности совсем нет ac
В скрипте планируется выполнять разные команды для групп файлов. Решил командам назначить переменные. Так же чтобы не дублировать списки файлов, решил переменную с командой передавать в качестве аргумента при вызове метки со списком файлов.
Столкнулся с проблемой: в командах имеются пробелы, поидее берем "переменную_с_командой" в кавычки, передаем как аргумент при вызове подпрограммы, а в подпрограмме пишем:
%~1 файл_1
%~1 файл_2
....
НО: в команде нужны кавычки, в целом она имеет вид:
"%~dp0files\prog.exe" Argument_1 Argument_2"
и тут уже пошли проблемы, пробовал разные варианты (тестовый скриптик, сначала просто вывод содержимого переменной, потом передача переменной в подпрограмму, нужен идентичный результат, так как команда иногда будет просто использоваться, а иногда передаваться как аргумент):

вариант 1

@echo off
cls
echo.
set "comand_1="%~dp0files\prog.exe" Argument_1 Argument_2"
echo.
echo %comand_1% FILE_001.txt
echo.
call :1 "%comand_1%"
echo.
pause >nul
:1
echo.
echo %~1 FILE_001.txt
echo.
exit /b

вариант 2

@echo off
cls
echo.
set comand_1="%~dp0files\prog.exe" Argument_1 Argument_2
echo.
echo %comand_1% FILE_001.txt
echo.
call :1 "%comand_1%"
echo.
pause >nul
:1
echo.
echo %~1 FILE_001.txt
echo.
exit /b
тут я кстати был удивлен, мне всегда казалось что если в носить в переменную значение с пробелами, то нужно все это дело обнять кавычками (от set и до конца значения), но как выяснилось - разницы нет, дальше уже со строкой set.. не экспериментировал

вариант 3

@echo off
cls
echo.
set "comand_1=%~dp0files\prog.exe Argument_1 Argument_2"
echo.
echo %comand_1% FILE_001.txt
echo.
call :1 "%comand_1%"
echo.
pause >nul
:1
echo.
echo %~1 FILE_001.txt
echo.
exit /b
этот уже просто был от отчаяния, так как путь к программе все-таки необходимо заключить в кавычки, так как работает только с echo, если пытаться выполнить саму программу - путь естественно не найден..

вариант 4 (вроде рабочий)

@echo off
cls
echo.
set "comand_1="%~dp0files\prog.exe" Argument_1 Argument_2"
echo.
echo %comand_1% FILE_001.txt
echo.
call :1 %comand_1%
echo.
pause >nul
:1
echo.
echo %* FILE_001.txt
echo.
exit /b
так уже получилось перенести всю команду из переменной в исходном виде. может и не стоило зацикливаться но том что это должен быть один аргумент...
1 вопрос - Как на ваш взгляд, последний вариант не подведет? есть ли другой?
2 вопрос - Возможно не в последний раз буду этим пользоваться, возможно команды будут более длинные. Аргуметов ведь может быть максимум 9 (погуглил - пишут с помощью "SHIFT" можно это обойти, из справке по команде не совсем понял сколько можно получить), но я правильно понял - это ограничение никак не касается, если пользоваться %* ??? ведь тогда нет обращения к конкретному (например 11му) аргументу, просто берется сразу все это добро?
3 вопрос - получается не обязательно писать так:
set "var=aaa bbbb ccc ..."
можно и так:
set var=aaa bbb ccc ...
разницы нет? или это зависит от версии винды?

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3607
  • Репутация:127

    [+] [-]
cartmenezz, почувствуй разницу:
set a=1 2 3
полностью аналогично
set "a=1 2 3"
а вот с этим
set "a=1&2&3"
"номер" не прокатит
И ещё, обычно берут в кавычки, чтобы не "зевнуть" лишние пробелы в конце. Или, наоборот, вставить нужное их количество:
set "a=1 2 3   "

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, aa
82558почувствуй разницу
82558полностью аналогично
ну так в том то и дело, что аналогично, что тогда надо почувствовать?)) или Вы на это и намекали?
82558чтобы не "зевнуть" лишние пробелы в конце. Или, наоборот, вставить нужное их количество
ну это да
82558а вот с этим
Код:
set "a=1&2&3"
"номер" не прокатит
set "a=1^&2^&3"
правильно?
PS: ну а поповоду главного вопроса - "вариант 4" имеет право на жизнь? (ну и так же интересно, при использовании %* не важно колличество аргументов? всегда сработает?)

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3607
  • Репутация:127

    [+] [-]
82560set "a=1^&2^&3"
Нет. Я написал нормальный вариант, который НЕ прокатит БЕЗ кавычек. Точнее, без кавычек придётся "экранировать" спецсимволы.
%* - любое количество аргументов. И не действует SHIFT. То есть:
call :test 1 2 3
...
:test
echo %1
shift
echo %1
shift
echo %1
echo %*
выведет на экран:
1
2
3
1 2 3

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
del

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Снова я с вопросом.
есть необходимость установить определенный размер окна консоли, 120х40 например.
mode con:cols=120 lines=40
делает несовсем то что нужно, будет выполняться большое колличество команд, и в конце нужна возможность пролистать посмотреть как все прошло (без вывода в отдельный файл).
а "lines=40" жестко ограничивает колличество строк. В настройках cmd есть размер буфера экрана (9000 строк) и высота окна (30 строк, на 10ке по крайней мере), "lines=40" меняет оба этих значения. Нельзя ли как только высоту окна поменять?
(можно конечно прописать только "mode con:cols=120", но тогда окно открывается вытянутым вниз дальше панели задач. в принципе можно его потом стянуть за верхний край, но хотелось бы как-нибудь поаккуратнее)

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3607
  • Репутация:127

    [+] [-]
cartmenezz, попробуй сделать это через ярлык. Создай .lnk и в его свойствах пропиши нужное.

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, благодарю, попробую (правда хранить все это дело в самораспаковке уже не получится... но я в принципе сомневался насчёт такого выбора))

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3607
  • Репутация:127

    [+] [-]
cartmenezz, сам поковырял чутка тему. Вот смотри, создаём ярлык link.lnk для запуска:
%comspec% /c %tmp%\run.cmd
В свойствах прописываем размеры окна (типа 80х25) и размер буфера (типа 80х1000). Там же можно шрифт "Люсида, 18", например.
Теперь пишем в батнике:
start link.lnk

Получаем выполнение батника %tmp%\run.cmd шрифтом "Люсида, 18" и в окне с буфером 1000 строк.
При выполнении из батника важно писать именно start, иначе ярлык выполнится в текущем окне с текущими свойствами (а не какими нам надо).
---
Вообще, тема тонкая. Я проверял на 7-ке. Возможно, в 10-ке уже накрутили... консоль там теперь модерновая...

Страница 39 из 89


Показать сообщения:    

Текущее время: 20-Апр 05:06

Часовой пояс: UTC + 3


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