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

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

    [+] [-]
  • Откуда: Калининград
ttng, он здесь, вроде как, в последнее время не тусуется, спросите тут:
http://forum.ru-board.com/profile.cgi?action=show&member=dialmak

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

    ttng
  • 20627
  • Стаж: 5 лет
  • Сообщений: 48
  • Репутация:1

    [+] [-]
cartmenezz, Спасибо, загляну туда))) ну и надеюсь, ответит тот камрад, которому он этот батник делал))) он вроде здесь, хоть и заглядывает редко)))

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

    WGordy26
  • 27
  • Стаж: 9 лет 4 месяца
  • Сообщений: 27
  • Репутация:2

    [+] [-]
ttng,
Может то , что вам надо.https://disk.yandex.ru/d/WvDJXwg-J6_wVg[/url]

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

    darkalexx4
  • 346
  • Стаж: 9 лет 1 месяц
  • Сообщений: 174
  • Репутация:7

    [+] [-]
  • Откуда: Минск
initial_disk_v2
Кидаю обновленную ссылку, кому вдруг пригодится :-)
Всех с праздником.
Христос Воскрес!

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

    Gvint64
  • 24573
  • Стаж: 3 года 10 месяцев
  • Сообщений: 564
  • Репутация:63

    [+] [-]
aa На поигратся - ничего серьёзного - простой проигрыватель аудио видео и прямых ссылок - запустить PlayF.cmd или выбрать что нибудь из примеров Скачать

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

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

    [+] [-]
  • Откуда: Калининград
Ander_73, Здравствуйте aa
я тут пытаюсь потихоньку просвещаться...
сейчас вот читал немного про SetLocal, насчет EnableDelayedExpansion вы уже упоминали, что пользоваться желательно лишь тогда, когда нет других вариантов...
интересует параметр EnableExtensions. пишут:
EnableExtensions - обычно включена в системе по-умолчанию.
Но может быть выключена принудительно через реестр, а также по-умолчанию, выключена в некоторых старых ОС.
Поэтому, ее желательно включать во все скрипты.
подумал взять на вооружение добавлять в начало скрипта, всего одна строчка, есть не просит..
Возник вопрос, вот у меня например есть батник, и там много подпрограмм, в некоторых из них задействуются переменные, часто имена повторяются... вроде как обнулять значения не забываю, но тем не менее перестраховываюсь - каждая метка начинается с SetLocal.
Вопрос: достаточно ли в шапке батника один раз прописать SetLocal EnableExtensions, или в моем случае надо будет и в каждой метке (подпрограмме) изменить SetLocal на SetLocal EnableExtensions ??? Здравый смысл подсказывает, что то что прописано в шапке должно распростроняться на весть батник, но вдруг все-таки надо для каждого SetLocal расписывать требующиеся параметры (или иначе вообще его не прописывать)
ЗЫ: раз уж начал задавать глупые вопросы, сразу еще один:
есть ли принципиальная разница м/у ' GoTo :EOF ' и ' exit /b ' ? (погуглить я не забыл, но никакой конкретики не нашел)


Последний раз редактировалось: cartmenezz (2021-05-04 23:11), всего редактировалось 1 раз

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

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

    [+] [-]
cartmenezz, aa
Я сам не знаю, что делает EnableExtensions ag
85295достаточно ли в шапке батника один раз прописать SetLocal
Важно понимать, что это не "директива компиляции", а обычная команда. Она выполняет выделение нового стека переменных и копирование туда текущих значений. Блок должен обязательно заканчиваться командой EndLocal, который освобождает выделенный стек и делает текущим предыдущий (до команды SetLocal). Вся эта чехарда обычно нужна при вызове стороннего батника (или крупной процедуры), в котором неизвестно какие пременные и что он там меняет по ходу пьесы. То есть:
setlocal
call other_file.cmd
endlocal
обеспечит безопасность собственных переменных. Потому что все изменения в переменных, которые сторонний батник произведёт, будут сброшены командой EndLocal.
85295есть ли принципиальная разница м/у ' GoTo :EOF ' и ' exit /b
На мой взгляд, нет. Есть, как обычно, нюанс. С помощью exit /b можно "передать наружу" код завершения.
Типа:
exit /b 12
завершит процедуру/батник с errorlevel = 12. В то время как GoTo :EOF завершит процедуру/батник с текущим значением errorlevel (так можно передать "наружу" итог выполнения последней команды, потому что goto не меняет значение errorlevel).

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 6 месяцев
  • Сообщений: 526
  • Репутация: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
  • 205
  • Стаж: 9 лет 2 месяца
  • Сообщений: 125
  • Репутация:7

    [+] [-]
Приветствую всех, может кто-нибудь знает, как на cmd написать скрипт, чтобы он спросил у пользователя: "Если вы хотите сделать это действие, то нажмите любую клавишу" и при этом бы дал время на ответ пользователю только N секунд, по прошествии которых, если пользователь ничего не нажал, то выполнить один код, а если нажал любую клавишу, то таймер останавливается и выполняется другой код.
Можно запустить choice, но он предлагает только две клавиши на выбор, а не все клавиши клавиатуры. Есть timeout, но в нем нет никакого выбора...

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

    vovan1982
  • 214
  • Стаж: 9 лет 2 месяца
  • Сообщений: 1098
  • Репутация:76

    [+] [-]
  • Откуда: Ростов-на-Дону
Eagle123, привет. Используй Wbox.exe

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

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

    [+] [-]
85297Endlocal необязательно писать, что выполнится итак при завершении батника/подпрограммы
Корректней сказать: "при завершении выполнения cmd.exe". Потому что батник можно вызвать из другого батника и завершение вызванного батника не вызовет автоматического выполнения endlocal. Код:
:proc
setlocal
...
if %var%==0 exit /b
...
endlocal
goto :eof
пример типичной "лажи". Выход из процедуры не означает выполнения endlocal.
85297остальные SetLocal/EndLocal поубирать
Да, "обрамлять" вызов процедуры проще и компактней, чем пихать в каждую.
Не запутайся в переменных. af-Вот пример задания (и использования) errorlevel:
call :proc&& goto success|| goto fail
:proc
if %var%==0 exit /b 1
exit /b 0
(exit /b 0 имеет смысл писать, если нужно вернуть однозначно 0, а результат предыдущей операции (его errorlevel) неясен)

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 6 месяцев
  • Сообщений: 526
  • Репутация: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
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация: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 секунд.

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

    Eagle123
  • 205
  • Стаж: 9 лет 2 месяца
  • Сообщений: 125
  • Репутация:7

    [+] [-]
vovan1982, Ander_73,
Ух ты, спасибо большое за решения, попробую!

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

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

    [+] [-]
  • Откуда: Калининград
Ander_73, разрешите ещё вопросик,
возможно ли добавить пробел (или несколько) в начало "PromptString" в конструкции:
set /p "var=ВВОД: "
тоесть, чтобы в консоли отображалось не "ВВОД: ", а " ВВОД:"

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


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

Текущее время: 28-Мар 20:50

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


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