2

Мне просто нужно спросить, является ли это ожидаемым поведением, оно наверняка удивило меня.

У нас есть пакетный файл, который копирует некоторые файлы из подкаталога, в котором он находится, в другое место на каждом компьютере разработчика. Поскольку для некоторых разработчиков этот целевой каталог отличается от остальных, мы установили переменную среды пользователя и использовали ее в командном файле.

Это пример строки из командного файла:

ROBOCOPY Staging\*.* "%DISTRIBUTE_TARGET%" *.* /IS

Это не удалось на одной машине, и после некоторых экспериментов я понял, что на этой машине переменная имеет обратную косую черту как часть содержимого переменной.

На большинстве машин (фактически, на всех других машинах, где она работала) переменная выглядела так:

DISTRIBUTE_TARGET=C:\Some\Directory

но на этой машине было:

DISTRIBUTE_TARGET=C:\Some\Directory\

обратите внимание на добавленную обратную косую черту там.

Сообщение об ошибке, выданное ROBOCOPY, заключалось в том, что со вторым параметром что-то не так, но казалось, что все от начала этой переменной и до конца строки было во втором параметре.

То есть. сообщение об ошибке выглядело так:

Error in second parameter: "C:\Some\Directory\" *.* /IS"

Я предполагаю, что произошло то, что обратная косая черта "ускользнула" от символа кавычки, что удалило его значение как "конец параметра в кавычках", и, таким образом, остальная часть строки была просто взята как часть аргумента.

Это ожидаемое поведение? Означает ли это, что переменные с обратной косой чертой по какой-либо причине или цели просто не могут быть безопасно использованы?

2 ответа2

5

На самом деле это относится не только к robocopy, но скорее к функции API-интерфейса CommandLineToArgvW .

CommandLineToArgvW имеет специальную интерпретацию символов обратной косой черты, когда за ними следует символ кавычки ("), следующим образом:

2n обратной косой черты, за которой следует кавычка, дают n обратной косой черты, за которой следует кавычка.

(2n) + 1 обратная косая черта, за которой следует кавычка, снова приводит к n обратной косой черте, за которой следует кавычка.

n обратной косой черты, за которой не следует кавычка, просто производит n обратной косой черты.

Те же правила описаны в разделе Синтаксис аргументов командной строки C++

Обходной путь должен добавить . все, что вы знаете, это каталог (например, "C:\Program Files\.")

2

Из этой статьи:

Если источником или местом назначения является "длинное имя в кавычках", не включайте обратную косую черту, поскольку это будет трактоваться как escape-символ, то есть «C:\some path\» завершится ошибкой, но «C:\some path\\» или "C:\some path" будет работать.

Это проблема, специфичная для робокопии. Я бы даже сказал, что это ошибка.

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

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