Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)

Модерирует : gyra, Maz

Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

cchameleone



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
(часть 1) (часть 2) (часть 3) (часть 4)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
» Описание Cmd.exe » Command shell overview
» Using batch files » Using batch parameters » Using filters » Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Попов А. Командная строка и сценарии Windows (PDF). Курс лекций для начинающих
· Бокалий В. Командная строка (pdf-брошюрка в 20 страниц)
· Александров А., Дибров А. Урок bat-аники (pdf)
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Скрываем консольные окна, Выполнение BAT-скриптов без вызова окна консоли
· cmdow — изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· blat — отправка почты из консоли
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)

Всего записей: 2279 | Зарегистр. 16-10-2015 | Отправлено: 09:22 29-04-2016 | Исправлено: Maz, 08:47 26-03-2020
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
thejustsoul

Цитата:
и надо ли

Надо.

Цитата:
обращаться к переменной CHANGE как "%CHANGE%" или как "!CHANGE!"

Как !Change!. И дело не только в скобках, а и во включенном delayed expansion.

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 20:59 07-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
Немного - что?

Не того, ни этого ... см.далее  
 

Цитата:
при включенном delayed expansion используете %-раскрытие, со всеми вытекающими.

Хмм...
1. Это запрещено?
2. Какие вытекающие? EnableDelayedExpansion, всего лишь разрешает применение "!" в качестве разделителя и соответственно расширение переменных в виде !var!, но это отнюдь не запрещает применение %-раскрытия... то бишь, при определенном использовании расширений переменных и наличии "!" в пути, есть вероятность "утери" в сценарии реальных папок и файлов
3. Кроме того, setlocal делает все переменные локальными...
 
Это всё к тому, что это:

Цитата:
Как !Change!.

не аксиома, хотя, чаще всего, предпочтительно именно такое использование.  
Кстати, вроде бы, мы тут совсем недавно беседовали на тему последовательных раскрытий %% vs !!, в одной строке - помните результаты тестов?  
 
Добавлено:
thejustsoul

Цитата:

Код:
if exist CHANGE (  
    for /F "delims=" %%i in (CHANGE) do set CHANGE=%%i  
)  

 тут (за скобками) обращаться к переменной CHANGE как "%CHANGE%" или как "!CHANGE!"  ?  

Тут, за скобками, Вы получите значение переменной из последней итерации, в любом варианте. И в таком именно применении, вовсе нет необходимости включать отложенное расширение...оно имеет смысл для этого применения:

Цитата:

Код:
if "%FILE%"=="test.exe" (  
    for /F "delims=" %%d in ('dir /B /A:D "tmp\*"') do set APPDIR=%%d  
   тут нужно обращаться к переменной как "!APPDIR!"  
   <...>  
)
 

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

Цитата:

Код:
set "file=x:\!!!длинный путь с пробелами и восклицательными знаками\Имя файла.ext"  
if exist "%file%" (  
    for /F "usebackq delims=" %%i in ("%file%") do set CHANGE=%%i&&call echo CHANGE=%%CHANGE%%  
)
 
его можно записать и так:

Код:
set "file=x:\!!!длинный путь с пробелами и восклицательными знаками\Имя файла.ext"  
if exist "%file%" (  
    for /F "usebackq delims=" %%i in ("%file%") do (
        set CHANGE=%%i
        call echo CHANGE=%%CHANGE%%
    )
)

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 21:30 07-06-2016 | Исправлено: YuS_two, 21:32 07-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
1. Это запрещено?

Не запрещено, но если значение переменной может содержать "!", то, сами понимаете, %-раскрытие использовать не следует. Именно чтобы не было упомянутой "утери".
 

Цитата:
это ... не аксиома

Не аксиома, но ситуации, где предпочтительнее использовать call-раскрытие, весьма специфичны. В данном случае однозначно рекомендуется !-раскрытие. В т. ч. по соображениям производительности.
 
Добавлено:
YuS_two

Цитата:
Тут, за скобками, Вы получите значение переменной из последней итерации, в любом варианте. И в таком именно применении, вовсе нет необходимости включать отложенное расширение

Только не забывайте, что значение переменной будет взято из файла. Соответственно, может содержать любые символы. И при %-раскрытии (как и при call-раскрытии, кстати) парсеру от них может поплохеть.

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 21:46 07-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
если значение переменной может содержать "!", то, сами понимаете, %-раскрытие использовать не следует. Именно чтобы не было упомянутой "утери".  

И всё таки, !-раскрытие, это не панацея, а в некоторых случаях и вовсе неприменимо ... говорю же, не того, ни этого
Чтобы не быть голословным, я расширил пример немного:

Код:
@echo off
rem пример пути к файлу: c:\!!111ОдинОдинразраз\
set fil=file.txt
setlocal enabledelayedexpansion
if not defined pap (set /p pap="Введите абсолютный путь к файлу: ")
rem ===============================================================
if exist "%pap%%fil%" (
    echo 1. Файл существует
    echo 1. %pap%
    call :test "1. %pap%"
) else (
    echo 1. Индейская хижина
    echo 1. %pap%
    call :test "1. %pap%"
)
if exist "!pap!!fil!" (
    echo 2. Файл существует
    echo 2. !pap!
    call :test "2. !pap!"
) else (
    echo 2. Индейская хижина
    echo 2. !pap!
    call :test "2. !pap!"
)
pause&&exit
:test
echo "%~1"
exit /b

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

Цитата:
но ситуации, где предпочтительнее использовать call-раскрытие, весьма специфичны.

Не очень-то они специфичны, см.выше.  
"call :metka param" - достаточно часто применяется изнутри цикла...
 

Цитата:
В т. ч. по соображениям производительности.

Это да, полностью согласен...
 

Цитата:
Только не забывайте, что значение переменной будет взято из файла. Соответственно, может содержать любые символы. И при %-раскрытии (как и при call-раскрытии, кстати) парсеру от них может поплохеть.

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

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 22:43 07-06-2016 | Исправлено: YuS_two, 22:49 07-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two

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

Потому что вызываемая подпрограмма некорректно написана: вы используете %-раскрытие при неизвестном состоянии delayed expansion. Явно отключите его в начале подпрограммы - и все будет работать.
 

Цитата:
Не очень-то они специфичны, см.выше.  
"call :metka param" - достаточно часто применяется изнутри цикла...

Под call-раскрытием я подразумеваю синтаксис вроде "call echo %%var%%". Его использование оправдано при тройном раскрытии переменной, а также когда нужно отложенное раскрытие, но нельзя использовать !-раскрытие (например, если делаем замену и подстрока сама может содержать "!"). Прямо скажем, нетривиальные ситуации.
 

Цитата:
это уже не совсем моя "головная боль", как дающего рекомендации, ведь код составлял не я

Так рекомендация-то неверна: нельзя раскрывать через "%" переменную, потенциально содержащую хрен знает что. И конкретный код здесь ни при чем.

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 01:22 08-06-2016 | Исправлено: GCRaistlin, 01:27 08-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
Потому что вызываемая подпрограмма некорректно написана: вы используете %-раскрытие при неизвестном состоянии delayed expansion. Явно отключите его в начале подпрограммы - и все будет работать.  

Да ладно!? И что там некорректного?
Ну, а если серьезно, то вопрос-то был в !-раскрытии, пример был под него сделан... понятно, что при отключенном (это состояние по умолчанию) отложенном расширении, %-раскрытие будет работать, как впрочем и при включенном. Ещё раз: вопрос был в !-раскрытии...
 

Цитата:
Под call-раскрытием я подразумеваю синтаксис вроде "call echo %%var%%".

Call-раскрытие, это миф. Call просто осуществляет двойной проход, вот и всё, а двойное раскрытие - это уже следствие этого.
 

Цитата:
Его использование оправдано при тройном раскрытии переменной, а также когда нужно отложенное раскрытие, но нельзя использовать !-раскрытие (например, если делаем замену и подстрока сама может содержать "!")

А с чего у нас тут дискуссия развилась?

Цитата:
А если в переменной записан путь, который содержит восклицательные знаки?

 
Ок, если расширенный пример написать конкретнее:

Код:
@echo off  
rem пример пути к файлу: c:\!!111ОдинОдинразраз\  
set fil=file.txt  
setlocal enabledelayedexpansion  
if not defined pap (set /p pap="Введите абсолютный путь к файлу: ")  
rem ===============================================================  
if exist "!pap!!fil!" (  
    call :test "2. !pap!"  
)
pause&&exit  
:test  
echo "%~1"  
exit /b

Это нетривиальная ситуация?
- это я к тому, что:

Цитата:
!-раскрытие, это не панацея, а в некоторых случаях и вовсе неприменимо

 

Цитата:
Так рекомендация-то неверна: нельзя раскрывать через "%" переменную, потенциально содержащую хрен знает что.

Т.е. Вы предлагаете не давать никаких рекомендаций, пока вопрошающий не опишет полностью все условия? Это фантастика, чаще всего...
Так многие вопросы останутся совсем без ответа... но с обидой в голове у вопрошающего...
Кроме того, нельзя - всего лишь, ничем не подтверждённый запрет.  
А интерпретатор консоли, вообще капризная и взбалмошная дама, которая падает в обморок на каждый чих - никакой стабильности в синтаксисе, слишком много если, чтобы учесть все "нельзя"... поэтому и программы в cmd выходят такими извращенно-монструозными.
 
 
Добавлено:
А-а-а, дошло таки о чем говорилось здесь:

Цитата:
вы используете %-раскрытие при неизвестном состоянии delayed expansion. Явно отключите его в начале подпрограммы - и все будет работать.  


Если я правильно понял то, об этом:

Код:
@echo off  
rem пример пути к файлу: c:\!!111ОдинОдинразраз\  
set fil=file.txt  
setlocal enabledelayedexpansion  
if not defined pap (set /p pap="Введите абсолютный путь к файлу: ")  
rem ===============================================================  
if exist "!pap!!fil!" (  
    call :test "2. !pap!"  
)
pause&&exit  
:test
setlocal disabledelayedexpansion
echo "%~1"  
exit /b

?
Если так, то с первого раза не дошло потому, что:
1. Почему состояние не определено? Оно как раз известно и включено, но...
2. Говорил ведь о даме... на каждый чих приходится платочек новый доставать, чтобы подтереть.

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 05:58 08-06-2016 | Исправлено: YuS_two, 06:34 08-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two

Цитата:
Call-раскрытие, это миф

Я просто подыскал этому синтаксису название покороче. Можно было назвать и "%%-раскрытием", но из-за того, что этим термином часто называют %-раскрытие, возможна путаница.

Цитата:
А если в переменной записан путь, который содержит восклицательные знаки?

В значении переменной может быть что угодно - это никак не мешает раскрывать ее по "!". А я говорил о наличии "!" в имени переменной. Вам часто приходится использовать такие переменные?

Цитата:
!-раскрытие, это не панацея

С данными мною выше оговорками - именно панацея. Более того: если нельзя гарантировать, что в значении переменной отсутствуют "запрещенные" символы (а в вашем примере это именно так), раскрывать ее следует только по "!".

Цитата:
Т.е. Вы предлагаете не давать никаких рекомендаций, пока вопрошающий не опишет полностью все условия?

Все дано в начальном коде вопрошающего: значение переменной Change получается из файла - значит, раскрываем ее только по "!".

Цитата:
нельзя - всего лишь, ничем не подтверждённый запрет.

Подтвержденный вашим же примером.

Цитата:
А интерпретатор консоли, вообще капризная и взбалмошная дама, которая падает в обморок на каждый чих

Абсолютно некорректная аналогия. В отличие от дамы, тонкие места интерпретатора известны и обходимы, причем, как правило, отнюдь не монструозными конструкциями. В основом - тем самым !-раскрытием, которое вы почему-то столь не любите.

Цитата:
Почему состояние не определено?

Потому что при первом вызове оно выключено, а при втором - включено. Это и называется "неизвестно". И явно выключать его перед использованием %-раскрытия - это как окавычивать на всякий случай имена файлов. Или стирать за собой временные файлы. Или мыть руки перед едой. Ведь без всего этого во многих случаях можно обойтись, не правда ли?

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 10:49 08-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
В значении переменной может быть что угодно - это никак не мешает раскрывать ее по "!".

Это вполне может быть, но с выполнением определенных условий... опять же.

Цитата:
Вам часто приходится использовать такие переменные?

Вообще не приходится Хватает фантазии на сочинение чего-нибудь более приемлемого...

Цитата:
С данными мною выше оговорками - именно панацея.

Если бы это было так, то никакого %-раскрытия не понадобилось бы вовсе... ну на кой столько лишних проблем? И раннее связывание, и проблематичный ввод спецсимволов и прочее-прочее... зачем это всё, если существует !-раскрытие?
А, наверное, потому они необходимы, что нехороший микрософт забыл про %1, реализуя отложенное расширение? шутка

Цитата:
значение переменной Change получается из файла - значит, раскрываем ее только по "!".

Есть какие-то официальные рекомендации-источники? Вообще, при чтении различных источников, сложилось мнение, что изначально !-раскрытие добавлено для помощи обхода раннего связывания переменных, т.к. при первом чтении строки происходит раскрытие переменных и становится проблематично их использовать... а остальное - вторичные бонусы. Ну.да ладно, это не принципиально.

Цитата:
В основом - тем самым !-раскрытием, которое вы почему-то столь не любите.  

Разве я где-то делал подобные заявления? Вовсе нет и с большой охотой использую. Но ведь, опять же, если бы !-раскрытие было бы панацеей, то зачем бы нужна была возможность %-раскрытия, в том числе и двойная...
Но да, чаще предпочитаю именно %. Да, кстати, вот порылся и нашел, отчасти ещё из-за этого предпочитаю %, хоть "!-раскрытие" двойное именно (не просто последовательное раскрытие двух переменных в строке, а именно двойное) и быстрее, чем %...
Всего лишь, пытался показать, что путей решения имеется числом более одного...
 

Цитата:
Потому что при первом вызове оно выключено, а при втором - включено. Это и называется "неизвестно".

Что-то я перестал понимать причину и следствие. На пальцах можно показать, что к чему?
 

Цитата:
В отличие от дамы, тонкие места интерпретатора известны и обходимы, причем, как правило, отнюдь не монструозными конструкциями.

Имхо, дискуссия переходит в область философского спора... пора её закруглить
Тем не менее, не станете же Вы спорить с тем, что в более совершенных языках некоторые вещи пишутся парой команд или строк, которые в cmd уже требуют "пары страниц кода"? В общем-то, это даже не мое личное мнение, вернее не только мое...

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 13:46 08-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two

Цитата:
Это вполне может быть, но с выполнением определенных условий... опять же.

Нет, на сей раз - без всяких условий. Просто - что угодно, и всё.

Цитата:
Вообще не приходится

Что подтверждает мои слова - сфера применения call-раскрытия очень специфична, и при разборе простых случаев о возможности применения этого тормозного костыля можно не упоминать вовсе.

Цитата:
Если бы это было так

Вы, кажется, по-прежнему ставите это под сомнение? Можете опровергнуть мои слова на примере?

Цитата:
никакого %-раскрытия не понадобилось бы вовсе... ну на кой столько лишних проблем? И раннее связывание

Раннее связывание - это не проблема, а удобная фича, без которой иной раз не обойтись.

Цитата:
проблематичный ввод спецсимволов

Во многих случаях спецсимволам в переменных взяться неоткуда, и тогда удобнее пользоваться %-раскрытием. Опять же, у замены через !-раскрытие есть существенные ограничения по сравнению с %-раскрытием.

Цитата:
и прочее-прочее...

Что за "прочее"? Вроде нет больше ничего.

Цитата:
Есть какие-то официальные рекомендации-источники?

Можно подумать, официальность что-то добавляет истинности утверждения. Если вы с ним не согласны - попробуйте опровергнуть. Если не получается - может, с ним просто стоит согласиться?

Цитата:
при чтении различных источников, сложилось мнение, изначально !-раскрытие добавлено для помощи обхода раннего связывания переменных... а остальное - вторичные бонусы

Это исключительно проблема источников, которые упускают из виду важный аспект. Вообще, для проверки любого скрипта "на вшивость" есть простой тест: подсунуть ему в качестве параметра

Код:
 
)"&
 

Если вылетит - значит, защита от дурака ни к черту.

Цитата:
Что-то я перестал понимать причину и следствие. На пальцах можно показать, что к чему?

Подпрограмма у вас вызывается дважды. В первый раз - при выключенном delayed expansion, во второй - при включенном. При этом в подпрограмме используется %-раскрытие параметра, который может содержать что угодно, т. к. это вводимая с клавиатуры строка. Поэтому в начало подпрограммы добавляем:

Код:
 
if "" == "!!" setlocal disabledelayedexpansion
 

Вы, в принципе, уже, как я вижу, попробовали и убедились, что так все работает.

Цитата:
не станете же Вы спорить с тем, что в более совершенных языках некоторые вещи пишутся парой команд или строк, которые в cmd уже требуют "пары страниц кода"?

Ну, про "пару страниц" вы явно загнули.
У скриптов cmd.exe главное преимущество - то, что они работают из коробки и одинаково во всех ОС начиная с NT, а их интерпретатор имеет смешной размер. Какой "более совершенный" язык может таким похвастаться? Никакой. И не сможет никогда.
 
Добавлено:

Цитата:
вот порылся и нашел, отчасти ещё из-за этого предпочитаю %

Я тоже его предпочитаю. Но только в том случае, если 100% не может быть проблем со спецсимволами. Рассуждения типа: "Мой скрипт для нормальных людей, а нормальный человек такое в качестве параметра подсовывать не станет" - в пользу бедных.

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 14:37 08-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
Нет, на сей раз - без всяких условий. Просто - что угодно, и всё.

Увы, это не так... глобальные и локальные переменные несколько отличаются друг от друга. Просто хотелось увидеть возможность передачи значений от одного другому... естественно, с помощью !-раскрытия. Это не утверждение, а вопрос...

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

Спорное утверждение, как раз таки относительно простых случаев, не требующих высокой производительности.

Цитата:
Опять же, у замены через !-раскрытие есть существенные ограничения по сравнению с %-раскрытием.

Так, стоп, я ничего не понимаю уже... то !-раскрытие - панацея, то есть у него ограничения... надо где-то уже поискать истину в золотой середине, имхо.

Цитата:
Можете опровергнуть мои слова на примере?

Я больше вопросы пытаюсь задавать и стараюсь поменьше сыпать утверждениями, в виду малого количества знаний в предмете обсуждаемого вопроса. А сомнению я подвергаю всё, для чего не увидел доказательств. Истинность утверждения должна быть подтверждена более весомыми доказательствами, чем простецкими "нельзя" и "можно"... ну, это по моему личному имхо, естественно.

Цитата:
Можно подумать, официальность что-то добавляет истинности утверждения.

Официальное руководство в применении - хоть какое-никакое, но доказательство. Но пока не попадалось, увы.

Цитата:
Если вылетит - значит, защита от дурака ни к черту.

А для чего существует экранирование? И для чего создано различное использование из командной строки и из пакетного сценария? Вот, нет четкого понимания и всё тут... и руководств никаких, кроме эмпирического опыта...

Цитата:
Подпрограмма у вас вызывается дважды. В первый раз - при выключенном delayed expansion, во второй - при включенном.

Так, стоп... а можно процитировать, где включено и где выключено? Т.е о какой подпрограмме речь? Особенно, в первоначальном варианте.
Если не ошибаюсь,у меня там четвертой строкой:

Код:
setlocal enabledelayedexpansion

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

Цитата:
Ну, про "пару страниц" вы явно загнули.

Ну, есть немного, подумаешь чуток утрировал, но в общем и целом, сам принцип именно такой.

Цитата:
У скриптов cmd.exe главное преимущество - то, что они работают из коробки и одинаково во всех ОС начиная с NT, а их интерпретатор имеет смешной размер. Какой "более совершенный" язык может таким похвастаться? Никакой. И не сможет никогда.

Говорю же, дискуссия плавно перетекает в чисто философский спор Тут главное договорится о том, что всё таки считать преимуществом, а что нет - загвоздка, чаще всего, именно в этом.

Цитата:
 Рассуждения типа: "Мой скрипт для нормальных людей, а нормальный человек такое в качестве параметра подсовывать не станет" - в пользу бедных.

Вот-вот - чистая философия
 
ЗЫ Блин, что-то меня это всё начало утомлять. Может завершим на этом прения? Могу только сказать словами классика: я знаю только то, что я ничего не знаю. И это будет самым неопровергаемым утверждением, причем достаточно близким к аксиоме.
 

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 19:52 08-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two

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


Код:
 
setlocal enabledelayedexpansion
set /p "String=Enter a string: "
for /f "delims=" %%A in ("!String!") do (
  endlocal
  set String=%%A
)
set String
 

Это не говоря о том, что delayed expansion иной раз вообще не обязательно выключать. В тех самых "простых случаях, не требующих высокой производительности". Коих большинство.

Код:
 
@echo off
set Arg1=%1
set Arg2=%2
setlocal enabledelayedexpansion
...
 

 

Цитата:
стоп, я ничего не понимаю уже... то !-раскрытие - панацея, то есть у него ограничения...

Для безопасного обращения к значениям - панацея. Для замены чего-либо в этих значениях - есть ограничения.
 

Цитата:
Истинность утверждения должна быть подтверждена более весомыми доказательствами, чем простецкими "нельзя" и "можно"

Я объяснил, почему "нельзя". В качестве доказательства можно рассматривать ваш же код.
 

Цитата:
А для чего существует экранирование?

При чем тут экранирование? Кто должен экранировать? Пользователь, передающий параметр скрипту?
 

Цитата:
И для чего создано различное использование из командной строки и из пакетного сценария?

Оно не "создано для чего-то", а обусловлено внутренней логикой интерпретатора. Это различие - безусловный минус cmd.exe, но на практике малозначимый, по крайней мере для меня: не люблю из космтроки работать - удобнее временный скрипт создать.
 

Цитата:
Официальное руководство в применении - хоть какое-никакое, но доказательство.

То есть если некое утверждение никак не получается опровергнуть, какие эксперименты ни приводи, - это еще ничего не значит. А вот если то же самое будет написано в некоем "официальном руководстве" - это да... Смешно немножко.
 

Цитата:
Так, стоп... а можно процитировать, где включено и где выключено?

А, пардон, действительно. Ну и тем более: вы точно знаете, что delayed expansion включен, и ленитесь его отключить перед %-раскрытием. Ну что тут сказать - ССЗБ.

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 22:35 08-06-2016 | Исправлено: GCRaistlin, 22:42 08-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
То есть если некое утверждение никак не получается опровергнуть, какие эксперименты ни приводи, - это еще ничего не значит. А вот если то же самое будет написано в некоем "официальном руководстве" - это да... Смешно немножко.

Нет, не так. Теперь уже Вы преувеличиваете... видимо, для того чтобы стало смешно немножко?
Все мои попытки "опровержения" - всего лишь вариант поиска истины. Хотите процитирую Ваши утверждения, из-за которых, собственно и появляется желание найти "официальное руководство":

Цитата:
Как !Change!. Можете также почитать справку к SET.


Цитата:
Никакой проблемы нет. !-раскрытие происходит один раз. Вот если имя переменной содержит их, тогда да...


Цитата:
Немного - что? В первом случае вы при включенном delayed expansion используете %-раскрытие, со всеми вытекающими. При !-раскрытии все хорошо.

это изначальные Ваши ответы, причем идущие подряд. Поясню: не вижу здесь ни результатов экспериментов, ни вообще, что-либо заслуживающее доверия "на слово", ибо утверждения базирующиеся только на личном опыте и озвученные без каких-либо примеров, никак не могут являться доказательствами. Поэтому и ведется поиск официальных источников, особенно после подобных утверждений. Так что, смеяться можно конечно, но это никак не увеличит весомость всякого рода заявлений.
 

Цитата:
Я объяснил, почему "нельзя".

Это только потом стали появляться объяснения с примерами, когда моё природное занудство заставило Вас их сделать.  
Надо быть последовательным.
 

Цитата:
Оно не "создано для чего-то", а обусловлено внутренней логикой интерпретатора.

Т.е. программисты из микрософта, живут и работают по принципу Портоса "я дерусь, потому что дерусь"? Ну, конечно в переводе относительно программирования...
Нет, не думаю. То, что "обусловлено внутренней логикой интерпретатора", именно создавалось для чего-то и предполагалось, что будет использовано так или иначе. Разве нет? Причинно-следственные связи ведь должны существовать, имхо, они ведь не совсем дебилы там...
 

Цитата:
вы точно знаете, что delayed expansion включен, и ленитесь его отключить перед %-раскрытием. Ну что тут сказать - ССЗБ.

Никакой я не буратино и тем более не лентяй , просто это лишний пример про "платочек на каждый чих" и ведь если код достаточно сложный, то необходимо помнить все эти платочки (то логика у интерпретатора разная в зависимости от ситуации, то синтаксис не позволяет использовать спецсимволы, то экранировать особенные символы надо так, а другие иначе, то различный errorlevel на одну команду, в зависимости от .bat или .cmd и т.д., и т.п.) и применять там где возникает в них потребность, а где они мешают, их надо убирать-выключать и т.д. ... и всё это, вместо того, чтобы просто написать программу для какой-либо задачи, причем без лишних "тараканов" в голове.
Кстати, про экранирование, вот пример веселого синтаксиса от микрософта:

Цитата:

Код:
for /f "delims=" %%a in ('^<"file.txt" find ^^"^%%f^%%"') do echo %%a

где надо экранировать, то символы %, то кавычки, а то и сами символы экранирования...
А надо-то всего лишь было, считать в виде текста из файла набор символов "%f%" и вывести на экран, только при наличии в коде сценария переменной "f"
- это не извращение? Ну, да ладно, не в этом суть...

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 03:09 09-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Возвращаясь к написанному ранее:

Цитата:
Ну, про "пару страниц" вы явно загнули.  

Появилась мысль замерить пропорции на живых примерах. Как Вы думаете, вот такая простая консольная программка (игра крестики-нолики, отсутствие вирусов гарантирую, а также работу, как минимум, на XP и выше, на более ранних не проверял), сколько займет строк кода в cmd-реализации? Если оценить сразу сложно, могу исходники выдать... чтобы было проще сравнивать.

Цитата:
У скриптов cmd.exe главное преимущество - то, что они работают из коробки и одинаково во всех ОС начиная с NT, а их интерпретатор имеет смешной размер. Какой "более совершенный" язык может таким похвастаться? Никакой. И не сможет никогда.

Имхо, главное преимущество в открытости - всегда можно посмотреть, а не format ли c: там прописан. Ну и возможность подкорректировать, если вдруг что-то не устраивает.
А смешной размер - нынче в преимуществах не ходит.

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 05:30 09-06-2016 | Исправлено: YuS_two, 05:33 09-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two

Цитата:
это изначальные Ваши ответы, причем идущие подряд. Поясню: не вижу здесь ни результатов экспериментов, ни вообще, что-либо заслуживающее доверия "на слово"

Первый ответ - это ответ вопрошающему; он требовал только совета, а не его обоснования. Второй - уж вы, я думаю, в состоянии проверить его истинность:

Код:
 
set var=!windir!
setlocal enabledelayedexpansion
echo !var!
 

Ну, а истинность третьего вы подтвердили сами - заранее, приведя вот тут результаты запуска тестового скрипта.

Цитата:
Т.е. программисты из микрософта, живут и работают по принципу Портоса "я дерусь, потому что дерусь"? Ну, конечно в переводе относительно программирования...

Нет. Вы ведь разницу в работе FOR имели в виду? Так вот, в скрипте FOR явно перечитывается дважды, а FOR-переменные раскрываются при втором проходе (что подтверждается их нечувствительностью к спецсимволам) - поэтому для них и требуется удвоение "%". Почему так реализовано - наверняка, не копаясь внутри cmd.exe, говорить сложно, но, полагаю, из соображений лаконичности/производительности кода интерпретатора - досовского command.com, из которого эта логика, по соображениям совместимости, и перекочевала в cmd.exe. Обычная история.
То же касается вашего мозголомного примера - ну ведь надо же какие-то символы в качестве специальных использовать, что же удивительного, что их использование в качестве обычных сопряжено с трудностями? Тут удивительнее то, что это все же возможно.

Цитата:
просто это лишний пример про "платочек на каждый чих"

Это особенность языка. Я не вижу здесь проблемы. Если Буратино не ленив, конечно .

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 12:33 09-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
Вы ведь разницу в работе FOR имели в виду?

Да нет, я имел в виду, что в синтаксисе вообще нет упорядоченности... ну, да, это можно называть особенностью языка, но речь-то о том, что эта особенность странная и хаотичная.
 

Цитата:
Так вот, в скрипте FOR явно перечитывается дважды, а FOR-переменные раскрываются при втором проходе (что подтверждается их нечувствительностью к спецсимволам) - поэтому для них и требуется удвоение "%". Почему так реализовано - наверняка, не копаясь внутри cmd.exe, говорить сложно, но, полагаю, из соображений лаконичности/производительности кода интерпретатора - досовского command.com, из которого эта логика, по соображениям совместимости, и перекочевала в cmd.exe. Обычная история.

Эта обычная история открывается просто, один cmd-джедай с киберфорума подсказал:
Команда, результат вывода которой разбирается в цикле, всегда выполняется в новом процессе интерпретатора, отсюда и двойное раскрытие.
Как доказательство, можно запустить такую конструкцию:

Код:
@echo off
set x=Windows
for /f "delims=" %%a in ('dir "c:\" ^|find "%%x%%"^& wmic process where name^='cmd.exe' get commandline/value') do echo.%%a
pause

- это достаточно наглядно демонстрирует откуда ноги растут у этих циклов...
И как следствие, результат работы в новом процессе аналогичен работе оператора call... Именно поэтому возможны и двойные раскрытия и "непонятная" работа того, что в обычных условиях не работает.

Цитата:
ну ведь надо же какие-то символы в качестве специальных использовать, что же удивительного, что их использование в качестве обычных сопряжено с трудностями?

Конечно надо, но либо это спецсимволы и их использование запрещено, кроме случаев экранирования, естественно, либо это обычные символы. Всё, этого достаточно, надо только утвердить символ экранирования. А на деле что? То удвоение, то экранирование, то удвоение с экранированием, то экранирование экранирования и прочие весёлые сочетания... сам чёрт ногу сломит, в этом хаосе и нагромождениях.

Цитата:
Если Буратино не ленив, конечно

Да буратины, они разные бывают, в зависимости от настроения
Так что на счет сравнения? Будем осуществлять?

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 17:18 09-06-2016
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_two

Цитата:
Будем осуществлять?

Задачка интересная, конечно, только где время найти... Кстати, компьютер у вас играет не идеально: в ситуации, когда он начинает, а человек ходит в 1, можно свести партию в ничью. А если ходить в 7 - уже гарантированно проигрываешь. Хотя какая, казалось бы, разница?

----------
Magically yours
Raistlin

Всего записей: 3988 | Зарегистр. 18-04-2005 | Отправлено: 18:24 09-06-2016
YuS_two



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
Кстати, компьютер у вас играет не идеально: в ситуации, когда он начинает, а человек ходит в 1, можно свести партию в ничью. А если ходить в 7 - уже гарантированно проигрываешь.

Да, уровень ИИ там ниже плинтуса, это скорее просто демо-пример из книжки, немного адаптированный к русской локали. А алгоритмы там не мои вовсе.  
Кстати, там есть ходы, которые 100% приводят к выигрышу человека... Всё это можно конечно улучшать и усложнять, но не было такой цели особо...

Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 19:07 09-06-2016
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ли в batch многоходовочное использование условий как на баше, в случае elif ? Т.е. ступенчатая проверка на соответствие условию, т.е. не совпало с а, пробуем b, не совпало с b, пробуем c ... Если совпало, выполняем команду, пропускаем последующие условия (нижнего  уровня) и продолжаем скрипт дальше.
 
Пока я знаю только такую вариацию if на bat в win - if %b%==%a% start2.bat, но это одноходовка, есть ли описанный в начале поста вариант ?

Всего записей: 2088 | Зарегистр. 19-09-2011 | Отправлено: 09:25 12-06-2016 | Исправлено: Baltazar500, 09:25 12-06-2016
Pasha_ZZZ



Запрет на пост
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Baltazar500
Цитата:
if %b%==%a% start2.bat

Цитата:
if %b%==%a% start2.bat else if %c%==%d% start3.bat

Всего записей: 12396 | Зарегистр. 11-03-2002 | Отправлено: 10:06 12-06-2016
boss911



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В своем батнике, в самом начале, использую команду:

Код:
MODE CON COLS=90 LINES=38

В батнике есть команда, результат которой может выводить информацию в 35 строк и более, минимальное количество строк мне известно, а вот максимальное нет. Проблема в том, что если выхлоп больше, чем 38 строк, то происходит обрезка сверху, боковой скрулбар в таком случае не появляется, чтобы прокрутить текст, а команды, которая бы задавала размер буфера окна, я так понял, нет. Прописать эдак LINES=100 тоже не вариант (высота окна на весь экран, да и еще окно заползает под панель задач), запускать батник настроенным ярлыком или чем-то другим тоже не хочется. Есть решение?

Всего записей: 3696 | Зарегистр. 29-01-2005 | Отправлено: 17:00 12-06-2016
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru