Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
 
Dragokas
Эксперт WindowsАвтор FAQ
16601 / 6986 / 846
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
#1

Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора* - CMD/BAT

10.01.2013, 15:41. Просмотров 59750. Ответов 106

Эта тема - ответвление Тонкости языка, редкие команды и сложные скрипты

Постим сюда детали, которые Вы получили опытным путем.
Которые считаете уникальными, или могут быть полезными при наборе кода BAT файлов, лучшего понимания принципов работы среды командной строки.
Пишем ошибки, которые иногда допускаете, а потом ломаете голову, почему не работает

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

Собрано по категориям:

Файловые операции
5) Использование рабочего каталога Bat файла в роле начального для выполнения команд в нем на ОС >= Vista ссылка
8) Как проверить - существует ли папка ссылка
10) Не использовать && после команды Del. ссылка
12) После перехода в другой каталог проверять успех операции ссылка
18) Листинг текущего каталога или корневого ссылка
24) Работа с файлами/папками, в именах которых есть буквы украинского алфавита. ссылка

Символы
1) Экранирование спецсимвола ссылка
13) Сохранение концевого пробела в переменную ссылка
17) Запятая и точка с запятой - разделители аргументов ссылка
30) Экранирование номера потока в перенаправлении вывода Echo ссылка

Переменные
2) Использование одноименных переменных без обнуления ссылка
3) Пренебрежение Setlocal ссылка
3.1) Не указав Setlocal EnableDelayedExpansion, используем знаки восклицания (!) для раскрытия значения переменных ссылка
6) Инициализация числового типа данных ссылка
14) Обход ошибки "Режим вывода команд на экран (ECHO) включен" ссылка
16) Пробелы тоже могут являться частью названия переменной ссылка
23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла ссылка
28) Двойное раскрытие переменной. Первыми раскрываются проценты. ссылка
29) Конструкция вида Echo.!Var:~0,1! не работает. ссылка

Циклы
7) EOL в цикле FOR - правильный порядок модификаторов ссылка
9) Использовать UseBackQ при чтении содержимого файла, имя которого может меняться ссылка
25) Получение даты и времени файла через цикл и команду For без ключа /S (рекурсия) и подпрограммы ссылка

Кодировка
4) Сохранение BAT-файла с кодировкой перевода строк в UNIX-стандарте ссылка
26) Кодировка в консоли ссылка
27) Текстовой файл не читается циклом по неизвестной причине ссылка

Тесты, оптимизация и граничные возможности интерпретатора
15) Граничные значения для числового типа в CMD ссылка
19) Максимальная глубина рекурсии = 593*. ссылка
20) Максимальная длина значения строки ссылка
21) Оптимизация кода ссылка
22) Тест замедления работы операторов при перегрузке оперативной памяти ссылка

Другое
1) Указывая метку подпрограммы, можно через пробел указывать ее описание. Среда не будет "ругаться" ссылка
11) Внимательно выбирайте имя для BAT(CMD)-файла ссылка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 15:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора* (CMD/BAT):

Ошибки при запуске bat-файлов - CMD/BAT
У меня проблема, что при запуске cmd.exe, что при запуске любого *.bat-файла, появляется такое же сообщение "c:/programПрограмма не...

Последовательный запуск нескольких BAT-файлов из основного BAT-файла - CMD/BAT
Доброго времени суток всем... Помогите кто понимает.. Есть bat... @echo off start "" "D:\$\Pale Moon\1\Palemoon-Portable"...

Запуск bat-файлов с параметрами, являющимися модификациями принятого запускающим bat-файлом параметра - CMD/BAT
Написать командный файл, который: • принимает в качестве параметра полное имя файла (диск+каталог+имя) • вызывает файл 1.bat, передавая...

Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета - C#
Заранее благодарен...

Ошибки при создании заметки - Drupal
Пару дней назад установил Друпал на Xampp, частенько на разных страницах пришет не большие "user warning" но при этом не отказывался...

Частые ошибки - Ноутбуки
Есть проблема и уверен что системная, а не программная. Проблема в том что во время установки программ, они устанавливаются не правильно,...

106
zb
6 / 6 / 0
Регистрация: 08.05.2017
Сообщений: 55
19.05.2017, 11:56 #91
Windows Batch file
1
echo ( | cmd
консоль начинает добавлять лишний перевод строки в поле вывода команд.
0
alpap
1307 / 1038 / 331
Регистрация: 26.04.2015
Сообщений: 3,757
19.05.2017, 14:17 #92
zb,
да здрасьте!
запуск пустой строки echo( или echo. - привычнее
потом запуск нового cmd с этой переданной пустой строкой
вот и получается две пустые строки.
2
Dragokas
Эксперт WindowsАвтор FAQ
16601 / 6986 / 846
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
24.07.2017, 19:41  [ТС] #93
Баг модификатора ~s (преобразование имени файла в формат 8.3)

Создайте папку с именем "Темповая папка"
Создайте в ней батник с именем "авп"
Выполните код:
Windows Batch file
1
2
@echo %~fs0
pause
На WinXP:
C:\DOCUME~1\9335~1\0016~1\7AA6~1\80C6~1.CMDп.cmd
На Win7:
C:\Users\Alex\Desktop\D1E9~1\BB43~1.CMD?.cmd
На Win10:
C:\Users\Alex\Desktop\D1E9~1\BB43~1.CMDЀ.cmd
1
YupiRex
183 / 140 / 32
Регистрация: 04.10.2013
Сообщений: 140
25.07.2017, 18:58 #94
Причем для Windows10 - именно на диске С: и дело не букве))
0
Миниатюры
Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*   Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*  
Dragokas
Эксперт WindowsАвтор FAQ
16601 / 6986 / 846
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
25.07.2017, 19:05  [ТС] #95
Не совсем понял методику твоего тестирования, и как следствие результаты тоже.
0
YupiRex
183 / 140 / 32
Регистрация: 04.10.2013
Сообщений: 140
25.07.2017, 19:31 #96
Опишу простейший
создаем папку "Темповая папка" в корне диска D: и C: в нее исполняемый файл "авп.BAT"

открываем консоль и запускаем батники:
C:\Users\Yupi>"C:\Темповая папка\авп.BAT"
C:\D1E9~1\B191~1.BATЀ.BAT
C:\Users\Yupi>"D:\Темповая папка\авп.BAT"
D:\Темповая папка\авп.BAT
теперь создадим папки D:\123 и C:\123, положим туда нашу тестовую папку с батником и по очереди подключим эти папки как виртуальный диск и запустим батники

subst e: "c:\123"
"e:\Темповая папка\авп.BAT"
e:\D1E9~1\B191~1.BATЀ.BAT

subst /D e:

subst e: "d:\123"
"e:\Темповая папка\авп.BAT"
e:\Темповая папка\авп.BAT
1
Alikberov
5 / 14 / 3
Регистрация: 03.05.2017
Сообщений: 48
Завершенные тесты: 1
09.09.2017, 12:07 #97
Цитата Сообщение от Dragokas Посмотреть сообщение
Application Crash консоли
Bash
1
(for %%A in () do echo %%A) | Rem
Например, сообщение о критической ошибке, как всегда. У меня в Win 7x64 консоль вообще вылетает.
Код
00007FF7??????D0 FF F3            push        rbx  
00007FF7??????D2 48 83 EC 20      sub         rsp,20h 
00007FF7??????D6 48 83 CB FF      or          rbx,0FFFFFFFFFFFFFFFFh 
00007FF7??????DA 45 33 DB         xor         r11d,r11d 
00007FF7??????DD 4C 8B D3         mov         r10,rbx 
00007FF7??????E0 49 FF C2         inc         r10  
00007FF7??????E3 66 46 39 1C 51   cmp         word ptr [rcx+r10*2],r11w 
00007FF7??????E8 75 F6            jne         00007FF7??????E0 
00007FF7??????EA 48 8B C3         mov         rax,rbx 
00007FF7??????ED 48 FF C0         inc         rax  
00007FF7??????F0 66 45 39 1C 40   cmp         word ptr [r8+rax*2],r11w -> RAX = 0000000000000000 R8  = 0000000000000000 R11 = 0000000000000000
Цитата Сообщение от Dragokas Посмотреть сообщение
Интересно, в XP тоже самое?
Код
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\User>C:\test.bat
C:\Documents and Settings\User>
P.S.: Windows'98: (Двойной %% отображается одинарно)
Код
Microsoft(R) Windows 98
   (C)Copyright Microsoft Corp 1981-1999.
C:\WINDOWS>C:\TEST.BAT
C:\>(for %A in ((null)) do echo %A )  | Rem
Имя команды или файла указано неправильно
0
SilverVox
1 / 1 / 0
Регистрация: 05.09.2017
Сообщений: 3
20.09.2017, 12:29 #98
Пролистал всю ветку, вроде подобного не нашел.

Столкнулся с некоторыми особенностями в именах переменных.
Если первый символ имени переменной является цифрой, то возникает путаница. Интерпретатор строку вида %2var% раскрывает как параметр командной строки %2. при этом значение из такой переменной получить можно посредством set 2var , или !2var!

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@prompt $G
@ECHO off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
 
(SET 24var=Value1)
(SET 32var=Value2)
 
 
ECHO.
ECHO.%24var%
ECHO.%32var%
ECHO.
SET 24var
SET 32var
ECHO.
ECHO.!24var!
ECHO.!32var!
ECHO.
PAUSE>NUL
EXIT /B
0
Dragokas
Эксперт WindowsАвтор FAQ
16601 / 6986 / 846
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
20.09.2017, 14:47  [ТС] #99
SilverVox, это не баг, а последовательность синтаксического разбора.

P.S. В других языках вообще запрещено именовать так переменные.
1
alpap
1307 / 1038 / 331
Регистрация: 26.04.2015
Сообщений: 3,757
20.09.2017, 17:24 #100
SilverVox,
можно так получить значение
Windows Batch file
1
2
3
set "1var=znach"
cmd/v/c echo %%1var%%
pause
но лучше записывать переменные так:
Windows Batch file
1
2
SET var24=Value1
SET var32=Value2
тогда не будет проблем с их выводом
1
SilverVox
1 / 1 / 0
Регистрация: 05.09.2017
Сообщений: 3
20.09.2017, 21:56 #101
Цитата Сообщение от Dragokas Посмотреть сообщение
это не баг, а последовательность синтаксического разбора.
Да, помнится читал об этой-же последовательности в справке по CMD вроде, есть где-то описанно, даже с примерами.
Тем не менее наступал на эти грабли несколько раз за последние 10-ть лет


Добавлено через 2 часа 47 минут
Еще вспомнил одну особенность команды RD.
С тех пор, как перешел на Windows7 (лет пять тому) обнаружил, что RmDir не возвращает код ошибки. (На Windows XP не помню, чтобы сталкивался с этим).
Мне сложно понять почему это происходит и как это объяснить с "научной" точки зрения, но покажу на практическом примере.
Кстати такое поведение наблюдалось не только в RmDir, но не помню точно с какими командами еще.

В данном случае с заведомо неверным параметром, код ошибки будет все-ровно 0.
Windows Batch file
1
2
3
RD NUL
ECHO.!ERRORLEVEL!
ECHO.%ERRORLEVEL%
А так команда вернет код ошибки, если включено отложенное расширение переменных среды
Windows Batch file
1
RD NUL  ||ECHO.!ERRORLEVEL!
Но если нужно относительно ERRORLEVEL реализовать условие, такое решение работает, даже если отложенное расширение переменных среды не включено.
Windows Batch file
1
2
RD NUL ||REM
IF "%ERRORLEVEL%"=="87" ECHO.Failed
Такое ощущение, как будто бы команда выполняется в какой-то отдельной среде.
Но я неуверен, как это правильно можно объяснить.
1
parmari
1 / 1 / 0
Регистрация: 15.04.2017
Сообщений: 25
30.11.2017, 13:47 #102
Кусок кода с поиском числа строк и последней строки (с последующем обрезанием ненужного):

Bash
1
2
3
4
5
6
7
8
set /a NUM=1
     for /f delims^=^ eol^= %%m in ('more +1^< "%%o"') do (
        set /a NUM=!NUM!+1
        echo.!NUM! %%m>i.tmp
     for /f "tokens=1,2* delims= " %%a in (i.tmp) do (
     @echo.%%a %%b>i.tmp
    )
    )
Если в файле 65535 строк и меньше - медленно, но работает, если больше - виснет напрочь.

P.S. Данные с датчика, где первая строка - время в мсек с момента запуска системы.
Как обойти проблему, кроме подключения дополнительного фильтра по размеру файла с учетом минимально возможной (или средней) длины строки - не знаю.
0
Dragokas
Эксперт WindowsАвтор FAQ
16601 / 6986 / 846
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
30.11.2017, 13:50  [ТС] #103
parmari, вы перепутали тему.
Здесь выкладывают только аналитическую информацию и без вопросов.
0
parmari
1 / 1 / 0
Регистрация: 15.04.2017
Сообщений: 25
30.11.2017, 14:07 #104
Число строк 65535 - вполне аналитическая информация. полученная опытным путем. Это 2^16-1, так называемое число Мерсенна. Остальное и правда - лишние подробности.
0
Dragokas
Эксперт WindowsАвтор FAQ
16601 / 6986 / 846
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
01.12.2017, 00:13  [ТС] #105
parmari, просто не понятно, зачем вы сюда это выложили и как относится к багам интерпретатора.
Под аналитической информацией подразумевается развёрнутый ответ, что вот так и при таком количестве будет виснуть -> следовательно нужно делать вот так и так, или вообще не использовать CMD.
Вы констатируете проблему и хотите получить помощь в её решении? Тогда создайте новую тему, и там вам предложат более быстрые варианты.
А магическое число здесь никак не является решающим фактором. Ваш код трудно назвать оптимизированным.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2017, 00:13
Привет! Вот еще темы с ответами:

Частые ошибки winapi - C++ WinAPI
Подскажите, что я делаю не так. Программа запускается без ошибок, но кнопку, которую я создаю, не видно, не видно иконку и изображение,...

Частые BSOD и разные ошибки - BSOD
Здравствуйте, помогите с проблемой: уже на протяжении где-то 2 месяцев постоянно выпадает BSOD (раньше никогда такого не было), ошибки в...

Частые ошибки в работе компьютера - BSOD
Доброго времени суток. Перейду сразу к делу: После включения компьютера никакая программа не работает более 5-10 минут. Сразу закрывается...

Частые системные ошибки windows 8 - BSOD
Что то уж слишком часто начали появляться системные ошибки, почти все разные, ноут HP ENVY M6, ему всего 2 месяца. Подскажите в чем может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
105
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru