 Отправлено: 30-Апр-2021 18:00
(спустя 1 час 32 минуты)
ttng
 - Стаж: 6 лет
- Сообщений: 61
- Репутация:1[+] [-]
|
cartmenezz, Спасибо, загляну туда))) ну и надеюсь, ответит тот камрад, которому он этот батник делал))) он вроде здесь, хоть и заглядывает редко)))
|
WGordy26
 - Стаж: 10 лет
- Сообщений: 27
- Репутация:2[+] [-]
|
|
darkalexx4
  - Стаж: 10 лет
- Сообщений: 175
- Репутация:7[+] [-]
- Откуда: Минск
|
initial_disk_v2 Кидаю обновленную ссылку, кому вдруг пригодится :-) Всех с праздником. Христос Воскрес!
|
Gvint64
  - Стаж: 4 года 11 месяцев
- Сообщений: 621
- Репутация:72[+] [-]
|
На поигратся - ничего серьёзного - простой проигрыватель аудио видео и прямых ссылок - запустить PlayF.cmd или выбрать что нибудь из примеров Скачать
|
 Отправлено: 04-Май-2021 22:50
(спустя 1 день 22 часа)
cartmenezz
  - Стаж: 9 лет 7 месяцев
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, Здравствуйте  я тут пытаюсь потихоньку просвещаться... сейчас вот читал немного про SetLocal, насчет EnableDelayedExpansion вы уже упоминали, что пользоваться желательно лишь тогда, когда нет других вариантов... интересует параметр EnableExtensions. пишут:EnableExtensions - обычно включена в системе по-умолчанию. Но может быть выключена принудительно через реестр, а также по-умолчанию, выключена в некоторых старых ОС. Поэтому, ее желательно включать во все скрипты. подумал взять на вооружение добавлять в начало скрипта, всего одна строчка, есть не просит.. Возник вопрос, вот у меня например есть батник, и там много подпрограмм, в некоторых из них задействуются переменные, часто имена повторяются... вроде как обнулять значения не забываю, но тем не менее перестраховываюсь - каждая метка начинается с SetLocal. Вопрос: достаточно ли в шапке батника один раз прописать SetLocal EnableExtensions, или в моем случае надо будет и в каждой метке (подпрограмме) изменить SetLocal на SetLocal EnableExtensions ??? Здравый смысл подсказывает, что то что прописано в шапке должно распростроняться на весть батник, но вдруг все-таки надо для каждого SetLocal расписывать требующиеся параметры (или иначе вообще его не прописывать) ЗЫ: раз уж начал задавать глупые вопросы, сразу еще один: есть ли принципиальная разница м/у ' GoTo :EOF ' и ' exit /b ' ? (погуглить я не забыл, но никакой конкретики не нашел)
Последний раз редактировалось: cartmenezz (2021-05-04 23:11), всего редактировалось 1 раз
|
Ander_73
  - Стаж: 8 лет 2 месяца
- Сообщений: 3983
- Репутация:127[+] [-]
|
cartmenezz,  Я сам не знаю, что делает EnableExtensions  85295достаточно ли в шапке батника один раз прописать SetLocal Важно понимать, что это не "директива компиляции", а обычная команда. Она выполняет выделение нового стека переменных и копирование туда текущих значений. Блок должен обязательно заканчиваться командой EndLocal, который освобождает выделенный стек и делает текущим предыдущий (до команды SetLocal). Вся эта чехарда обычно нужна при вызове стороннего батника (или крупной процедуры), в котором неизвестно какие пременные и что он там меняет по ходу пьесы. То есть:setlocal call other_file.cmd endlocal обеспечит безопасность собственных переменных. Потому что все изменения в переменных, которые сторонний батник произведёт, будут сброшены командой EndLocal.85295есть ли принципиальная разница м/у ' GoTo :EOF ' и ' exit /b На мой взгляд, нет. Есть, как обычно, нюанс. С помощью exit /b можно "передать наружу" код завершения. Типа:завершит процедуру/батник с errorlevel = 12. В то время как GoTo :EOF завершит процедуру/батник с текущим значением errorlevel (так можно передать "наружу" итог выполнения последней команды, потому что goto не меняет значение errorlevel).
|
cartmenezz
  - Стаж: 9 лет 7 месяцев
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
85296Вся эта чехарда обычно нужна при вызове стороннего батника (или крупной процедуры) Т.е. в пределах одного своего батника можно не заморачиваться?85296С помощью exit /b можно "передать наружу" код завершения 85296GoTo :EOF завершит процедуру/батник с текущим значением errorlevel получается после GoTo :EOF имеем реальный errorlevel, а при exit /b можем его "придумать" (правда в голову не приходит для каких ситуаций это может пригодиться)? Добавлено через 17 минут 43 секунды: у меня в батнике, если очень упрощенно, имеется структураSetLocal :start пункты меню: 1 2 3 4 5 ... выбор пункта: set /p var= перход к метке с номером пункта: call %var% echo. pause GoTo :start :1 SetLocal ... EndLocal exit /b :2 SetLocal ... EndLocal exit /b :... и меня прям напрягало что при возврате в основное меню остаются хвосты значений переменных, потому что они пойдут дальше при выборе нового пункта и переходе к новой метке (даже по началу "выбором пункта" прописывал строки с выводом через echo значиний переменных, имеющихся в подпрограмме, и проверял чтобы эти строки оставались пустыми при возврате в основное меню)) поэтому батник и оброс этими SetLocal и Endlocal ... Кстати, попадалась, что вроде Endlocal необязательно писать, что выполнится итак при завершении батника/подпрограммы P/S: если все-таки не отказываться полностью от моей паранойи c очищением переменных при возврате в основное меню, я правильно понимаю что достаточно будет сделать вот так:выбор пункта: set /p var= перход к метке с номером пункта: SetLocal call %var% EndLocal echo. pause GoTo :start а все остальные SetLocal/EndLocal поубирать?
|
Eagle123
  - Стаж: 10 лет
- Сообщений: 127
- Репутация:7[+] [-]
|
Приветствую всех, может кто-нибудь знает, как на cmd написать скрипт, чтобы он спросил у пользователя: "Если вы хотите сделать это действие, то нажмите любую клавишу" и при этом бы дал время на ответ пользователю только N секунд, по прошествии которых, если пользователь ничего не нажал, то выполнить один код, а если нажал любую клавишу, то таймер останавливается и выполняется другой код. Можно запустить choice, но он предлагает только две клавиши на выбор, а не все клавиши клавиатуры. Есть timeout, но в нем нет никакого выбора...
|
Ander_73
  - Стаж: 8 лет 2 месяца
- Сообщений: 3983
- Репутация:127[+] [-]
|
85297Endlocal необязательно писать, что выполнится итак при завершении батника/подпрограммы Корректней сказать: "при завершении выполнения cmd.exe". Потому что батник можно вызвать из другого батника и завершение вызванного батника не вызовет автоматического выполнения endlocal. Код::proc setlocal ... if %var%==0 exit /b ... endlocal goto :eof пример типичной "лажи". Выход из процедуры не означает выполнения endlocal.85297остальные SetLocal/EndLocal поубирать Да, "обрамлять" вызов процедуры проще и компактней, чем пихать в каждую. Не запутайся в переменных. -Вот пример задания (и использования) errorlevel:call :proc&& goto success|| goto fail :proc if %var%==0 exit /b 1 exit /b 0 (exit /b 0 имеет смысл писать, если нужно вернуть однозначно 0, а результат предыдущей операции (его errorlevel) неясен)
|
 Отправлено: 05-Май-2021 12:03
(спустя 2 часа 32 минуты)
cartmenezz
  - Стаж: 9 лет 7 месяцев
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
85302Вот пример задания (и использования) errorlevel Благодарствую85302Да, "обрамлять" вызов процедуры проще и компактней, чем пихать в каждую Отлично))85302пример типичной "лажи". Выход из процедуры не означает выполнения endlocal потому что до скрипт не доберется до строчки endlocal если var=0 ? Касаемо того что я находил вот такую формулировку: "При достижении конца пакетного файла автоматически выполняется команда ENDLOCAL" (это было на ab57.ru, и не только) Мои эксперименты показали что и для подпрограмм это работает, еще раз освежил память как у меня там сейчас все прописано, в подпрограммах EndLocal я поубирал (кое-где только пропустил), так как и без него значения переменных обнулялись. Так что я до этого скинул немного неправильную структуру, на самом деле сейчас у меня так:SetLocal :start пункты меню: 1 2 3 4 5 ... выбор пункта: set /p var= перход к метке с номером пункта: call %var% echo. pause GoTo :start :1 SetLocal ... exit /b :2 SetLocal ... exit /b :... - Сейчас еще раз, на свежую голову, решил себя перепроверить, накидал пустышку:@echo off :start cls echo var_1=%var_1% echo var_2=%var_2% echo var_3=%var_3% echo. pause call :test echo. pause goto :start :test cls ::SetLocal set var_1=111 set var_2=222 set var_3=333 exit /b при возврате на :start значения переменных пустые, если раскомментировать SetLocal, без указания EndLocal ЗЫ: не с целью поспорить или что-то доказать, возможно в разных версиях винды работает по разному?
|
Ander_73
  - Стаж: 8 лет 2 месяца
- Сообщений: 3983
- Репутация:127[+] [-]
|
cartmenezz, хм, действительно. Значит, я неправ. Ну, тем проще.-Eagle123, если не нужна работе в WinPE, могу предложить вариант с VBS:@echo off >tst.vbs echo WScript.Echo CreateObject("WScript.Shell").Popup(Replace(WScript.Arguments(0), "^", vbCrLf), WScript.Arguments(1), WScript.Arguments(2), WScript.Arguments(3)) for /f %%a in ('cscript //nologo tst.vbs "Для выбора верного решения нажмите 'Ок'" 10 " Заголовок" 65') do set code=%%a del /q tst.vbs if %code%==-1 echo Time is over! if %code%==1 echo Ok is pressed. if %code%==2 echo Action canceled. 10 - это ожидание реакции 10 секунд.
|
cartmenezz
  - Стаж: 9 лет 7 месяцев
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, разрешите ещё вопросик, возможно ли добавить пробел (или несколько) в начало "PromptString" в конструкции:тоесть, чтобы в консоли отображалось не "ВВОД: ", а " ВВОД:"
|
Страница 46 из 94
Текущее время: 20-Апр 15:33
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|