Пакетный файл Windows - система не может найти указанную метку пакета - PullRequest
7 голосов
/ 06 октября 2009

Проблема

У меня проблема с командным файлом Windows и ярлыками. Я получаю эту ошибку:

Система не может найти этикетку партии указанный

Что я пробовал

  • два компьютера; WindowsXP и 2003 Сервер.
  • Убедился, что он закодирован как ASCII
  • Изменен шестнадцатеричный код для символов продолжения строки. Попробовал заменить все на CR, LF и CRLF по очереди. Все комбинации дают мне одинаковую ошибку.
  • Попытка вставить дополнительные символы перед меткой, чтобы метка прошла 512 символов.

Вот код:

cls
@echo off
SET zip=7za a dependencies.7z
call:dozip "c:\temp\dir.txt"

pause
goto exit

:dozip
  echo Testing 1.2.3...
  %zip% %1
goto:eof
:exit

Вот гекс с CRLF (0d 0a).

63 6c 73 0d 0a 53 45 54 20 7a 69 70 3d 37 7a 61 20 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 37 7a 0d 0a 63 61 6c 6c 3a 64 6f 7a 69 70 20 22 63 3a 5c 74 65 6d 70 5c 64 69 72 2e 74 78 74 22 0d 0a 0d 0a 70 61 75 73 65 0d 0a 67 6f 74 6f 20 65 78 69 74 0d 0a 0d 0a 3a 64 6f 7a 69 70 0d 0a 20 20 65 63 68 6f 20 54 65 73 74 69 6e 67 20 31 2e 32 2e 33 2e 2e 2e 0d 0a 20 20 25 7a 69 70 25 20 25 31 0d 0a 67 6f 74 6f 3a 65 6f 66 0d 0a 3a 65 78 69 74

Вот вывод консоли (когда я удаляю @echo off):

C:\>SET zip=7za a dependencies.7z

C:\>call:dozip "c:\temp\dir.txt"

C:\>echo Testing 1.2.3...
Testing 1.2.3...

C:\>7za a dependencies.7z "c:\temp\dir.txt"
The system cannot find the batch label specified - dozip

C:\>pause
Press any key to continue . . .

На самом деле он никогда не создает 7zip-файл, поэтому я могу предположить, что он вылетает в этой строке;

7za a dependencies.7z "c:\temp\dir.txt"

Если я сам запускаю эту строку из командной строки, она работает нормально и создает зависимости.7z, поэтому я не думаю, что это обязательно проблема с 7za.exe.

Я уже читал этот вопрос: stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-ex

и ссылка с этого поста; help.wugnet.com/windows/system-find-batch-label-ftopict615555.html

Ответ

Итак, я нашел проблему, ребята.

Я использовал технику, которую я обычно использую, которую я действительно мог описать только как «прокси» командные файлы. У меня есть папка с именем c: \ scripts, и я поместил туда несколько файлов bat, чтобы выбрать наиболее часто используемые exe Это спасает мою переменную PATH от абсолютной массивности со всеми инструментами командной строки. Таким образом, мне нужно только добавить сценарии c: \ в мою PATH и создать командный файл прокси, когда мне что-то понадобится.

У меня был 7za.bat в c: \ scripts, содержащий только это;

@echo off
"C:\Program Files\7-zip\7za.exe" %*

Я изменил свой сценарий на это;

SET zip="c:\program files\7-zip\7za.exe" a dependencies.7z

вместо этого;

SET zip=7za a dependencies.7z

и это сработало безупречно.

Мораль истории ...

Старайтесь не вызывать другие пакетные файлы из пакетного файла. Если вы это сделаете, вам нужно будет поставить перед ними префикс « call ».

Ответы [ 6 ]

5 голосов
/ 06 октября 2009

Я бы отметил, что «Тестирование 1.2.3 ...» и «Нажмите любую клавишу для продолжения ...» строки указывают, что выполнение успешно перешло к метке: dozip и затем успешно возвращено вызывающей стороне.

Является ли исполняемый файл "7za" на самом деле командным файлом? Если я изменю свой тестовый скрипт, чтобы помощник был командным файлом, я получаю ту же ошибку. Исправление заключается в том, чтобы сделать 'call% zip%% 1'

3 голосов
/ 06 октября 2009

Мораль истории: при вызове внешних программ / командных файлов в командном файле используйте call

call foo.bat

и / или

call %foo%

(Вызов одной партии из другой производился со времен DOS, просто не забудьте позвонить)

1 голос
/ 06 октября 2009

Одна из возможностей, хотя и кажется маловероятной, заключается в том, что расширения команд не включены или не обновлены, и это мешает поведению вызова / перехода / метки.

Попытка:

echo [%cmdextversion%]

и если оно меньше [2] (или пусто - []), проверьте, вызывается ли cmd.exe с помощью /e:off, или просто запустите

cmd /e:on

в окне консоли, где вы будете запускать этот командный файл.

0 голосов
/ 24 мая 2019

Сообщение об ошибке «Система не может найти указанную метку партии» привело меня сюда (через 10 лет!), И проблема оказалась в том, что CRLF был неправильным.

Причиной, в нашем случае, был Git Repository, который не распознавал BAT-файлы как текстовые файлы, которые должны были быть CRLF на компьютере с Windows 7.

Нашим решением было создать файл .gitattributes, содержащий строку:

*.bat text eol=crlf

Затем, удалив BAT-файлы и извлекая их из хранилища, переписали наши BAT-файлы с правильными окончаниями строк. Метки BAT теперь снова работают.

0 голосов
/ 06 октября 2009

Если присмотреться к вашему гексу, на самом деле он не имеет всего CRLF (0d 0a). Несколько строк заканчиваются только LF (0a без предшествующего 0d).

Проверьте в своем шестнадцатеричном редакторе, чтобы убедиться, что каждому 0a предшествует 0d (ровно один).

Или просто вырежьте и вставьте файл в пустой документ Блокнота и заново сохраните его.

0 голосов
/ 06 октября 2009

Используете ли вы Windows NT 4 / Windows 2000 ? Только там вы можете использовать CALL для вызова подпрограмм в одном и том же пакетном файле.

...