¿BUG? невозможно создать файл с '=' через командную строку ECHO и COPY CON

296
gerryLowry

Где документация, которая объясняет явно аномальное поведение знака равенства ниже?

ШАГИ ДЛЯ РЕПРОДУКЦИИ (в командной строке):

пример с ECHO:

H:\BUGS>echo abc > a-b.txt H:\BUGS>echo cde > c=d.txt H:\BUGS>dir 2016-03-13 19:54 6 a-b.txt 2016-03-13 19:54 12 c H:\BUGS>type a-b.txt abc H:\BUGS>type c cde =d.txt 

Примечания:
файл c :

636465203D642E7478740D0A  c d e = d . t x t  

файл ab.txt :

616263200D0A  a b c  

ОДНАКО (здесь '=' становится частью действительных имен файлов, если я использую кавычки):

H:\BUGS>ren a-b.txt a=b.txt The syntax of the command is incorrect.  H:\BUGS>ren a-b.txt "a=b.txt" H:\BUGS>ren c "c=d.txt" H:\BUGS>dir 2016-03-13 19:54 6 a=b.txt 2016-03-13 19:54 12 c=d.txt 

знак равенства является допустимым именем файла символ.

FWIW, кажется, что '=' не в кавычках имеет странное специальное значение в командной строке DOS.

OTOH, '=' является допустимым символом имени файла.

« Наименование файлов, путей и пространств имен »

используя Windows 8.1

редактировать:

H:\BUGS>echo def > "d=e.txt" H:\BUGS>dir 2016-03-13 20:36 6 d=e.txt H:\BUGS>type "d=e.txt" def 

Синтаксис выше работает.

конец редактировать.

редактировать № 2:

Майкл Франк помог мне найти больше информации.

Его информация позволила мне найти интересную статью SO " cmd-запятая для разделения параметров по сравнению с пространством? "

H:\BUGS>type Frank.cmd @echo %1/%2/%3  H:\BUGS>Frank 1 2 3 1/2/3  H:\BUGS>Frank 1=2=3 1/2/3  H:\BUGS>Frank 1;2;3 1/2/3  H:\BUGS>Frank 1,2,3 1/2/3  H:\BUGS>Frank 1/2/3 1/2/3// 

в приведенном выше, различные символы используются в качестве разделителей.

когда /использовался в качестве разделителя выше, /выбрасывается дополнительный ; это было бы ошибкой imho.

Тим Робинсон пишет, что в « cmd- запятая для разделения параметров по сравнению с пробелом? » в Windows программы отвечают за синтаксический анализ своих собственных командных строк. Оболочка анализирует перенаправления и каналы, а затем передает остальную часть командной строки программе в одна строка "

НИЖНЯЯ ЛИНИЯ: кажется, что там, где необходим разделитель, =действует как разделитель; в некоторых случаях =вызывает синтаксическую ошибку, в других =- просто знак равенства .

конец редактирования № 2.

0
поиск объяснения через Google не увенчался успехом; пока обходной путь решает проблему, для меня важно найти это в документации; любая помощь приветствуется. gerryLowry 8 лет назад 0
Избегайте `=` с помощью `^`. Например: `echo cde> c ^ = d.txt`. Michael Frank 8 лет назад 0
@MichaelFrank да, это тоже работает; благодарю вас; тем не менее, я действительно хочу знать, почему этот `=` ведет себя так; `=` не является одним из специальных символов, перечисленных здесь "* [Соглашения об именах] (https://msdn.microsoft.com/en-ca/library/windows/desktop/aa365247 (v = vs.85) .aspx # naming_conventions) * "~~` <`(меньше чем); `>` (больше чем); `:` (двоеточие); `" `(двойная кавычка);` / `(косая черта);` \ `(обратная косая черта);` | `(вертикальная черта или труба);`? `(вопросительный знак);` * `(звездочка) gerryLowry 8 лет назад 0
Смотрите мой ответ ниже, но в основном это символ-разделитель, используемый для разделения команд. Michael Frank 8 лет назад 0

1 ответ на вопрос

0
Michael Frank

Символ =является разделителем, функционально он выглядит так же, как пробел . Как вы можете видеть в примере ниже:

c:\NotBackedUp>echo abc>d efg.txt  c:\NotBackedUp>type d abc efg.txt 

Аналогично, =сделаем то же самое:

c:\NotBackedUp>echo abc>d=efg.txt  c:\NotBackedUp>type d abc=efg.txt 

Давайте посмотрим на вашу первую команду: echo cde > c=d.txt

Начиная с, вы вызываете echoкоманду, а затем передаете ей значение cdeдля вставки в файл c. Потому что =является разделителем, и вы не сказали, echoкуда нужно отправить следующую строку d.txt, то по умолчанию к предыдущему файлу: c.

Вы можете обойти это, либо указав свое выходное имя:

c:\NotBackedUp>echo abc>"d=e.txt" 

или экранируя разделитель с помощью ^:

c:\NotBackedUp>echo abc>d^=e.txt 

Оба из них создадут файл d=e.txtс содержимым abc.

Дополнительная информация о разделителях

спасибо за ссылку на сайт Саймона Шеппарда [ss64.com] (ss64.com) ... см. мою редакцию №2. Вы правы в том, что * иногда * `=` действует как разделитель. Для меня удивительно, что Microsoft не задокументировала это; я бы предпочел найти документацию от Microsoft; независимо от того, потому что сайт Саймона Шеппарда направил меня к лучшему пониманию, я отмечаю ваш ответ как ответ. gerryLowry 8 лет назад 0

Похожие вопросы