Не удается найти указанную метку пакетного файла
ОТВЕТЫ
Ответ 1
На самом деле вам нужно 2 условия:
- командный файл не должен использовать окончания строк CRLF
- метка, к которой вы переходите, должна охватывать границу блока (в отличие от и: метка конца, которая является просто ярлыком до конца вашего скрипта)
Дэвид А. Грей упоминает в комментариях, видя (в Windows 10), что маршалответил в 2014 году (предположительно в Windows 7 или 8): сценарий/пакетная программа ( .bat или .cmd ), выполняемая без CALL , запускает преобразование eol.
За последние 35 лет я написал сотни пакетных сценариев, и единственная проблема, с которой у меня когда-либо возникали проблемы с отсутствием меток, была, когда разрывы строк файлов были преобразованы из Windows (CR/LF), которая работает, чтобы Unix (LF), чего нет.
Ответ 2
У меня такая же проблема. Однако основная причина не была CRLF. Это было потому, что в script я выполнил внешнюю программу, такую как Ant, но не поставил CALL до Ant. Итак, убедитесь, что CALL каждая внешняя программа, используемая в вашей партии script.
Ответ 3
Коренной причиной является процессор командной строки DOS, (программа оболочки), принимает символ конца строки UNIX как часть метки. Поскольку переход на часть никогда не использует это как метку, он никогда не встречается, поскольку такой ярлык действительно не существует. Решение состоит в том, чтобы разместить дополнительное пространство в конце каждой целевой метки или даже лучше каждой строки. Теперь конец строк UNIX не появляется, поскольку пространство действует как разделитель, и все это работает.
Ответ 4
Если пакетный файл имеет окончание строки Unix (разделители строк), это иногда может произойти.
Просто unix2dos это и проблема должна быть решена.
Ответ 5
Вы также должны убедиться, что при вызове других скриптов вы используете CALL вместо их вызова в среде вызывающего абонента.
Ответ 6
Я столкнулся с аналогичной проблемой только с .cmd файлом и Windows 8. Решение состояло в том, чтобы изменить все концы строк на стиль CR + LF DOS. Проблема была запутанной, потому что пакетный файл в основном работал и перестраивал линии, изменил эффект.
Файл .cmd выглядел так:
Функция C вызовет ошибку "Система не может найти указанную пакетную метку". Как ни странно, это могло уйти, переставив вызовы. Изменение границ строк от 0x0A до 0x0D0A, похоже, исправило его.
Возможно, VonC означает "командный файл должен использовать окончания строки CRLF".
Ответ 7
У меня была эта проблема после копирования команды запуска из слова и вставки ее в окно команд. Был вариант с "-" спереди, и думал, что выглядит так же, как DOS "-" это было не так ". После ввода" - "сам вопрос был решен, и пакет работал. жесткий найти проблему.
Ответ 8
Немного другой вариант использования.
Я вызывал скрипт bat во время сборки Windows Server 2012 Server с использованием поставщика оболочки (OpenSSH). Теперь скрипт работал нормально с помощью cmd на подготовленной виртуальной машине (для остановки остановил сборку пакета и остановил ее, а затем подтвердил это). но с этими метками вызовов не было обнаружено проблем.
Концы строк были в порядке, CRLF (подтверждено в Notepadd++). Скрипт работал нормально и через командную строку. Более того, иногда он просто используется для нормальной работы, а иногда и для сбоя, но если для какого-то ярлыка произошел сбой, то сбой был последовательным.
Первоначально я только начал полностью удалять подпрограммы, расширив сам вызов и поместив код подпрограммы в строку. Я сделал это для всех случаев, когда был только один вызов (без дублирования кода).
Но, да, я наткнулся на один саб, который был вызван из 3,4 мест. Перепробовав все, вот что у меня сработало
PS: сценарий очень старый, но руководство нуждалось во мне, чтобы это работало через упаковщик (у нас есть план на второй день, чтобы заменить его на Ansible/Chef).
Прочитав пост Свой сапер на своих батниках и пробежавшись по коду, наткнулся на комментарий, что в батниках нет массивов (кстати, в последней версии Сапера, о котором идёт речь в том посте, нет этого комментария). Так вот, если в батнике необходимо использовать некоторый набор значений, то логично объявить такое кол-во переменных, которое требуется и работать с ними. Собственно данный сценарий эту задачу помогает решить проще. Вот несколько примеров:
Air Brush — подсветка синтаксиса в редакторе
Post by zg » Thu 25 Dec, 2008 06:58
This plugin provide syntax highlighing capability in internal FAR editor.
Air Brush — подсветка синтаксиса в редакторе
zg zero-gravity Posts: 5878 Joined: Tue 15 Mar, 2005 17:36 Location: riga Been thanked: 158 times Contact:
Принцип
Обращение с массивами происходит с помощью вызовов call :array и передачи соответствующих параметров. Первый параметр это действие, а второй имя массива. Ещё за этими двумя могут следовать дополнительно как обязательные, так необязательные параметры. Каждый массив представляет собой набор переменных вида array_[имя массива]_[индекс элемента] и одной переменной, содержащей размер — array_[имя массива]_count . Предполагается, что эти переменные вручную не изменяются.
Доступ к элементам
Доступ к каждому элементу возможен по индексу. Надо сказать пару слов о процедурах, возвращающих значение. Т.к. в батниках нет возможности вернуть значение из процедуры (будем так называть то, что вызывается через call), то приходится делать финт ушами: все процедуры, от которых ожидается результат, записывают его в переменную _l (эль маленькая, вроде как от слова last. Хотя потом я стал склоняться к тому, что result логичней). Имя переменной можно, как правило, переопределить, передав её имя последним параметром.
rem call :array get имя_массива [index=0] [имя_целевой_переменной=_l]
rem Получение первого элемента массива myArray. Результат будет содержаться в _l
call :array get myArray
echo Первый элемент - %_l%
rem Получение второго с конца элемента массива myArray в переменную ok
call :array get myArray -2 ok
echo Вот результат: %ok%
При отладке часто необходим быстрый вывод значений. В этом может помочь echo (алиас к get+echo) и dump (распечатка массива).
rem Вывод последнего элемента myArray
call :array echo myArray -1
rem Распечатка всего массива
call :array dump myArray
Для получения количество элементов используется команда count (она по сути просто читает его из переменной array_[имя массива]_count , но с дополнительными проверками на существование и проч.:
rem call :array find имя_массива искомый_элемент N [имя_целевой_переменной=_l]
rem Здесь N - просто замена флагу I. Если не указываете имя целевой переменной, то и N можно не ставить.
rem sebastNum будет содержать номер элемента, который равен Себастьяну с учетом регистра.
call :array find myArr "Себастьян Перейро" N sebastNum
rem и без учёта:
call :array find myArr "Себастьян Перейро" I sebastNum
rem и с учётом в переменную по умолчанию _l:
call :array find myArr "Себастьян Перейро"
Манипуляции с массивами
Пока я реализовал задание значения элементу по индексу, удаление элементов, копирование массивов, удаление массивов, добавление элементов.
И ещё надо сказать о наборах. Некоторым процедурам можно передавать в качестве параметров наборы. Эти наборы потом передаются команде for на обработку, поэтому они должны быть написаны так, как этот for хочет. А он не требователен: элементы набора разделяются запятой (,) или пробелом ( ), а строковые надо заключать в кавычки. Но т.к. сами параметры тоже заключаются в двойные кавычки, то в наборах должны быть одинарные ('). Смотрите пример add.
rem Задание значения
rem call :array set имя_массива индекс значение
call :array set myArray 5 'пятый элемент'
rem Копирование массива
rem call :array copy имя_копируемого имя_конечного
call :array copy myArray finalArray
rem Добавление элемента в конец массива
rem call :array add имя_массива значение
rem call :array add myArray 2012
rem Добавление элементов в конец массива. Здесь указывается набор, и чтобы значть, что это набор, нужно указать параметр ! - восклицательный знак
rem call :add имя_массива набор !
call :array add myArray "'строка один' 120 454.34 'sd'" !
rem Можно передать набор через expand и не указывать флаг "!"
call :array expand myArray "'строка один' 120 454.34 'sd'"
rem Удаление элементов из массива
rem call :array del имя_массива [индекс_элемента|набор элементов=удаление всего массива]
rem Если третьим параметром (первый это del) указать число, то будет удалёт эл-т с таким индексом
rem удаляет из массива myArr 9й элемент
call :array del myArr 9
rem Если передать набор, то будут удалены элементы с индексами из набора
rem удаляет из массива myArr элементы с индексами 4, 6 и 8
call :array del myArr "4,6,8"
rem А если не указывать третий парамет, то будет удален массив полностью
call :array del myArr
Airbrush - подсветка синтаксиса в редакторе
Post by CrOm » Thu 25 Dec, 2008 09:07
CrOm wrote: собрал, поставил. скорость радует, но вот вопрос:
где брать дополнительные схемы раскраски, например, для фаровских хелпов?
в хелпе как-то скудно описано про формат файлов, только про синтаксис.
t-rex Страшный и ужасный Posts: 4910 Joined: Tue 15 Mar, 2005 16:17 Location: Tel-Aviv Has thanked: 1 time Been thanked: 8 times Contact:
Post by t-rex » Thu 25 Dec, 2008 09:27
Post by CrOm » Thu 25 Dec, 2008 09:40
t-rex Страшный и ужасный Posts: 4910 Joined: Tue 15 Mar, 2005 16:17 Location: Tel-Aviv Has thanked: 1 time Been thanked: 8 times Contact:
Post by t-rex » Thu 25 Dec, 2008 13:05
Post by Aftalik » Mon 02 Feb, 2009 09:00
выложите пожлуйста бинарник airbrush
он вообще как заменя колореру под 2.0 пойдет? меня особо интересует подсветка php/asm
Post by Wave » Mon 02 Feb, 2009 11:27
Компилил ещё в прошлом годе, но уже после 655 билда (когда просили перекомпилить).
Не проверял после последней ломки API.
PHP подсвечивает. ASM — ну, синтаксис в комплекте есть.
Пользуюсь колорером (он хоть и не юникодный, но меня устраивает).
Post by Docent1 » Mon 23 Feb, 2009 17:34
zg
Нельзя ли сделать проверку на длину строки и ограничить: если больше, напимер 50 000, то не раскрашивать? У меня попадались файлы xml-файлы из одной строки больше 1400 000, так на них редактор зависал или ждать приходилось очень долго. Напимер, вот файл
zg zero-gravity Posts: 5878 Joined: Tue 15 Mar, 2005 17:36 Location: riga Been thanked: 158 times Contact:
Post by zg » Mon 23 Feb, 2009 18:12
Docent1 wrote: zg
Нельзя ли сделать проверку на длину строки и ограничить: если больше, напимер 50 000, то не раскрашивать? У меня попадались файлы xml-файлы из одной строки больше 1400 000, так на них редактор зависал или ждать приходилось очень долго. Напимер, вот файл
вообще для этого есть кнопка esc. но на приведённом файле да — виснет. причём в 1.7 всё ок. даже тормозит не сильно. баг где-то видимо
Post by DiRTy_GaRRy » Thu 12 Mar, 2009 07:43
Фар дико тормозит при раскраске приложенного файла.
FAR: 2.0.820
AirBrush: 0.9.14.0
zg zero-gravity Posts: 5878 Joined: Tue 15 Mar, 2005 17:36 Location: riga Been thanked: 158 times Contact:
Post by zg » Tue 24 Mar, 2009 03:14
Docent1 wrote: zg
Нельзя ли сделать проверку на длину строки и ограничить: если больше, напимер 50 000, то не раскрашивать? У меня попадались файлы xml-файлы из одной строки больше 1400 000, так на них редактор зависал или ждать приходилось очень долго. Напимер, вот файл
а тормозит тут не плагин. тормозит тут фар. и конкретно функа RealPosToTab. если в свойствах редактора выставить Expand all tabs to spaces, то тормоза чудным образом исчезают.
t-rex Страшный и ужасный Posts: 4910 Joined: Tue 15 Mar, 2005 16:17 Location: Tel-Aviv Has thanked: 1 time Been thanked: 8 times Contact:
Post by t-rex » Thu 26 Mar, 2009 19:56
Post by DiRTy_GaRRy » Thu 26 Mar, 2009 23:51
zg zero-gravity Posts: 5878 Joined: Tue 15 Mar, 2005 17:36 Location: riga Been thanked: 158 times Contact:
Post by zg » Fri 27 Mar, 2009 00:41
ну я ж описал причину. это фар табы в строке ищет. ну нет у вас там их всё равно. поставте для xml табы в пробелы, всё летает.
Post by DiRTy_GaRRy » Fri 27 Mar, 2009 16:17
В принципе, после некоторой медитации над кодом редактора оно теперь работает более-менее приемлимо, то есть визуально подтормаживает, но работает вполне сносно. Совсем сносно оно станет работать, только если избаивтся от такой забавной штуки, что на каждое движение курсора в файле стоящем из одной оооочень длинной xml-строки раскраска происходит 5 (!) раз. А так как строка является xml-м, то обработка 5 раз подряд массива цветов в 31 тычячу элементов несколько подтормаживает.
Постим сюда детали, которые Вы получили опытным путем .
Которые считаете уникальными, или могут быть полезными при наборе кода 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)-файла ссылка
система не может найти метку пакета, указанную name_of_label
конечно существуют метки. Что вызывает эту ошибку?
на самом деле, вам нужно 2 условия для этого:
- пакетный файл не должен использовать окончания строк CRLF
- метка, к которой вы переходите, должна охватывать границу блока (в отличие от метки and :end, которая является просто ярлыком до конца вашего скрипта)
у меня такая же проблема раньше. Однако первопричиной был вовсе не CRLF. Это было потому, что в скрипте я выполнил внешнюю программу, такую как Ant, но не поставил CALL перед Ant. Итак, убедитесь, что вы CALL каждая внешняя программа, используемая в вашем пакетном скрипте.
основной причиной является процессор командной строки DOS (программа оболочки), принимает Символ конца строки UNIX как часть метки. Поскольку go to part никогда не использует это как метку, он никогда не найден, поскольку такая метка действительно не существует. Решение состоит в том, чтобы поместить дополнительное пространство в конце каждой целевой метки или даже лучше каждой строки. Теперь UNIX end of lines не приходят играть, так как пространство выступает в качестве разделителя, и все это работает.
Если пакетный файл имеет окончания строк unix (разделители строк), это иногда может произойти.
просто unix2dos это и проблема должна быть решена.
вы также должны убедиться, что при вызове других скриптов вы используете вызов, а не вызываете их в среде вызывающего абонента.
У меня была эта проблема после копирования команды запуска из Word и вставить в окно командной строки. Был вариант с " - " на фронте, и думал, что выглядит так же, как DOS "-" это не было :) после ввода "-" самостоятельно проблема была решена, и пакет работал . трудно найти проблему .
я столкнулся с аналогичной проблемой только что с a .файл cmd и Windows 8. Решение состояло в том, чтобы изменить все окончания строк на стиль CR+LF DOS. Проблема была запутанной, потому что пакетный файл в основном работал, и перестановка строк изменила эффект.
The .cmd файл выглядел так:
функция C вызовет ошибку "система не может найти указанную метку пакета". Странно это может уйти переставляя звонки. Изменение окончаний строк с 0x0A на 0x0D0A кажется, все исправил.
возможно, VonC означает "пакетный файл должен использовать окончания строк CRLF".
Системе не удается найти ярлык пакета, указанный name_of_label
Конечно лейбл существовал. Что вызывает эту ошибку?
Дополнительные возможности
Это на мой взгляд самые интересные операции. Их можно было отнести к манипуляциям, но я решил выделить их отдельно.
Сохранение в файл в кодировке cp1251
Сохранение в файл можно реализовать, как уже говорилось выше, воспользовавшись перенаправлением вывода list. Но если нужно сохранить в файл в кодировке cp1251, то лучше воспользоваться командой save:
rem call :array save имя_массива имя_файла
call :array save results Результаты.txt
Сортировка массива
Выполняется командой sort. Можно было реализовать сортировку обычным пузырьком, но я решил всё же воспользоваться помощью команды sort. Но в этом подходе есть ряд минусов: создаётся два файла во временном каталоге (скинутый массив и отсортированный, которые затем, правда, всё же удаляются) и числа сортируются как строки. Плюсов правда тоже два: так, как мне кажется, всё же быстрее, хоть я и не гнался за скоростью (и это видно по операции del с набором индексов), и простота, и это меня и склонило окончательно к выбору этого метода.
rem call :array sort имя_массива [R - для сортировки в обратном порядке]
rem массив myArray будет отсортирован в обратном порядке
call :array sort myArray R
Применение процедуры к каждому элементу
Используется команда each и здесь есть два подхода. Первый это передача непосредственно команды. В этом случае можно использовать подстановки _i_ для индекса текущего элемента и _val_ для его значения. Чтобы скрипт понял, что вы передаете команду, укажите последним параметром x (икс)
call :array new B "1 4 1 6 7 2"
set sum=0
call :array each B "set /a sum+=_val_" x
rem sum будет содержать сумму всех элементов массива (двадцать одно)
Второй подход это указание метки, которая будет вызываться для каждого элемента: call :имя_указанной_метки значение индекс . Если первый способ отличается простотой, то этот предоставляет более гибкие возможности. Например:
rem Задаём массив
call :array new someArray "1902 2007 2012 1954 1945 1989"
rem Задаём начальные данные
set pos=0
call :array get someArray %pos% val
rem Вызываем для каждого элемента процедуру findMax
call :array each someArray findMax
rem Выводим результат
echo Максимальный год %val%. Позиция %pos%
:findMax
rem Здесь %~1 - значение (без кавычек, за счёт ~)~, %2 - индекс.
Создание массивов
Для создания массивов есть несколько методов. Основные это create, new и load.
Метод create создает массив заданного размера. Также можно задать начальные значения, которые по умолчанию равны нулю. И ещё, надо сказать, что значения не могут быть пустыми, это особенность команды set.
rem call :array call :array create имя_массива [размер=0] [начальные значения=0]
rem Создание пустого массива
call :array create myArray
rem Создание массива, размером 5. При этом все элименты равны нулю - 0
call :array create myArray 5
rem Создание массива, размером 5 и все элименты равны строке "my value"
rem Значения будут без кавычек
call :array create myArray 5 "my value"
Но куда более удобно создавать массив сразу с заданием значений. Для этого служит команда new:
rem call :array new имя_массива "знач1, знач2, 'строка' . "
rem Создание массива A со значениями 90, 56, 'два слова'
call :array new A "90 56 'два слова'"
Можно загрузить значения из внешнего файла. Хочется заметить, что исходный файл должен быть в кодировке 1251 и текущая кодовая страница не влияет на это:
rem call :array load имя_массива имя_файла
rem Чтение значений из файла records.txt в Table. Каждая строка - одно значение. Пустые строки пропускаются
call :array load Table records.txt
Читайте также:
- Лечение активного заражения касперский зависло
- Почему часы amazfit не подключаются к телефону по блютузу
- В распределенных сетях компонентами служат не отдельные компьютеры а отдельные локальные сети
- В playstation 4 не активируется кукла вуду гида в террарии
- Данных кода и баз данных чем больше значение кэша тем лучше производительность