-1

Когда я пробую CD\ с нашего привода карты, я получаю:

ошибка:'cd\' не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

Но с пробелом (cd \) это работает,

T:\bat>cd\

'cd\' не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

T:\bat>cd \

T:\>

Кто-нибудь может сказать мне, почему это?

2 ответа2

2

CmdPi повторяет полученную мудрость о том, что командные интерпретаторы Microsoft работают как оболочки UNIX. Именно так каждый голосовал ногами в 1980-х годах. Но на самом деле они не сделали и до сих пор не делают.

Имена команд могут и могут быть отделены от хвостов команд значительным количеством символов, а не только пробелами. Можно использовать символ равенства, например, или запятую. path=C:\DOS - это команда и хвост. Так же, как и dir,dos . Самый известный, можно использовать полную остановку. Отсюда и всем известное echo. трюк для отображения пустой строки в командном скрипте. Что менее известно, так это echo; , echo+ , echo= , echo( , echo, echo[ , echo] , echo\ и echo/ будут делать то же самое (хотя и не всегда для некоторых из них).

Фактически, есть вызов API DOS (int 21h,ax=6505h), который можно использовать для получения полного списка символов, которые являются так называемыми "символами завершения имени файла". И интерпретаторы команд DOS используют его, чтобы определить, какие символы заканчивают имя команды и начинают хвост команды. (Интерпретаторы команд Microsoft для операционных систем не-DOS, вероятно, просто передают набор символов.)

Обратный слэш является один из этих символов, а в командных интерпретаторов из command Microsoft в MS-DOS в cmd Microsoft в Windows NT (включая /cmd IBM, Microsoft, для OS /2 по пути) можно выполнить cd\ и результат будет тот интерпретатор команд меняет каталог на \ . То, включен ли символ завершения в хвост команды, в действительности зависит от команды. С помощью команды cd это так. С командами dir и path это не так. (Да, анализатор командной строки в интерпретаторах команд Microsoft ведет себя по-разному в зависимости от того, какая встроенная команда должна быть запущена.)

Это никогда не было задокументировано, хотя. Как я уже сказал: большинство людей в 1980-х годах проголосовали ногами за принятие парадигмы оболочки UNIX, хотя такие вещи, как разбор аргументов и цитирование, являются обширной заговорщической выдумкой, реализованной вовсе не интерпретатором команд, а библиотеками времени выполнения нескольких языков программирования. реализации для DOS; и вы обнаружите, что большая часть литературы уверенно заявляет, что пробел отделяет имя от хвоста, хотя на самом деле это не так. echo. Обычно описывается причуды и хитрости, и очень редко описывается как просто один случай общего синтаксиса, который командные интерпретаторы Microsoft использовали в течение примерно трех десятилетий.

Я рекомендую следовать здесь тенденции 1980-х годов, а не полагаться на этот малоизвестный синтаксис. Используйте пробелы. Это то, что люди документируют. Это то, что сами IBM и Microsoft документируют. Это то, что утверждает народная мудрость. Это то, чего ожидают руководители UNIX. ☺

Мой командный интерпретатор шел с синтаксическими диаграммами и описаниями, которые есть в IBM doco. Однако вы обнаружите, что FreeCOM реализует это мало документированное поведение, как и интерпретаторы команд JP Software и command из OpenDOS. Документация JP Software рекомендует использовать пробел и описывает использование других символов завершения как "незаконных". Это, однако, одно из немногих мест, в которых фактически говорится в официальной документации, что есть альтернатива.

дальнейшее чтение

1

CD - это команда \ параметр.

Вы должны разделить оба пробела.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .