Пакет: длина этикетки - PullRequest
       2

Пакет: длина этикетки

8 голосов
/ 30 сентября 2011

Мне было интересно узнать о максимальной длине метки в командном файле.

Я нашел эту статью Microsoft , в которой говорится:

MS-DOSтолько первые восемь символов метки пакетного файла;последующие символы игнорируются.

Они также предоставляют пример:

@echo off
goto latestch
:latestchanges
echo two
:latestch
echo three

, который должен выводить

two
three

вместо

three

Но в моей системе я получаю

three

Я пробовал на Windows 7 (6.1.7600) и WindowsXP (5.1.2600), и получаю одинаковый результат на них обоих.

Мне кажется, нет восьми символов!
Я что-то упустил?

Ответы [ 5 ]

10 голосов
/ 30 сентября 2011

Ограничения: 2047 и 8192, в зависимости от вашей ОС. См. эту статью базы знаний .

5 голосов
/ 30 сентября 2011

Пример верен для MS-DOS, а не cmd.exe. Версия вашего cmd.exe выше MS-DOS. Не стесняйтесь использовать этикетки любой длины.

Согласно этой статье, это ограничение действительно для:

Microsoft MS-DOS 4.01 Standard Edition
Microsoft MS-DOS 5.0 Standard Edition
Microsoft MS-DOS 5.0a
Microsoft MS-DOS 6.0 Standard Edition
Microsoft MS-DOS 6.2 Standard Edition
Microsoft MS-DOS 6.21 Standard Edition
Microsoft MS-DOS 6.22 Standard Edition
1 голос
/ 30 сентября 2011

Я почти уверен, что ограничение в 8 символов прошло, когда Windows отошла от платформы MS-DOS после Windows 98. Все операционные системы Microsoft, начиная с Windows 2000, больше не имеют ограничения. Окно команд, которое мы видим сегодня в Windows 7 и других, представляет собой приложение, которое выполняется поверх Windows, а не в более старой реализации, где командное окно обращалось к слою MS-DOS, работающему под Windows.

0 голосов
/ 14 февраля 2019

Windows cmd.exe поддерживает длину метки длиной до 128 символов (включая начальное двоеточие).Любые символы после 128 просто игнорируются.

Таким образом, длина метки 500 будет соответствовать длине метки 300, если первые 128 символов обеих меток одинаковы.поведение:

@echo off

call :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 125
call :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 126
call :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 127
call :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 128
call :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 129
call :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 130

exit /b

:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo %1 finds 125
exit /b

:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo %1 finds 126
exit /b

:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo %1 finds 127
exit /b

:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo %1 finds 128
exit /b

:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo %1 finds 129
exit /b

:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo %1 finds 130
exit /b

- ВЫХОД -

125 finds 125
126 finds 126
127 finds 127
128 finds 128
129 finds 128
130 finds 128
0 голосов
/ 12 октября 2013

Пакетные команды Windows 7 CMD и BAT, использующие GOTO :LABEL, не ограничены 8 символами после символа «:», как первоначально было отмечено исходным постером, когда они выполняются напрямую или вызываются из другого пакетного файла.

т.е.,

@echo off
SET VARIABLE=2
if %VARIABLE%.==.  GOTO :LABELNUMBERZERO
if %VARIABLE%.==1. GOTO :LABELNUMBERONE
if %VARIABLE%.==2. GOTO :LABELNUMBERTWO
if %VARIABLE%.==3. GOTO :LABELNU
if %VARIABLE%.==4. GOTO :LABELN
GOTO :ENDTHISLONGTHING
:LABELNUMBERZERO
echo your variable was " "
GOTO :ENDTHISLONGTHING
:LABELNUMBERONE
echo your variable was "1"
GOTO :ENDTHISLONGTHING
:LABELNUMBERTWO
echo your variable was "2"
:ENDTHISLONGTHING
:LABELNU
echo your variable was "3"
:ENDTHISLONGTHING
:LABELN
echo your variable was "4"
:ENDTHISLONGTHING

Результат этого: ваша переменная была "2"

Если я set VARIABLE=4, результат будет: ваша переменная была "4"

Таким образом, DOS теперь видит даже с одинаковыми именами (начальные символы) как уникальные метки, даже если в пакетном файле уже есть такое же содержимое более короткой метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...