Учитывая, что мы говорим о пакете, я думаю, что код, который вы видели, был set arg1="%1%"
(без пробелов вокруг =
).
Вы правы, %1%
будет интерпретироваться как %1
(первый аргумент / параметр в пакетном файле), за которым следует один %
, который интерпретатор игнорирует, поскольку не находит второй %
, чтобы закрыть имя переменной. ( Примечание 2 )
Это работает (потому что интерпретатор "исправляет" это (вроде - Примечание 2 )), но синтаксически неверно (вероятно, должно быть set ARG1="%1"
, что все еще является плохой практикой кодирования ( Примечание 1 ) - но это трудно решить, не видя контекста (иначе "больше кода"))
Примечание 1: (хорошо описывается @aschipfl): лучший (и рекомендуемый) способ - set "ARG1=%~1"
, который сначала удаляет потенциальное цитирование (из-за ~), а затем присваивает значение переменной ARG1
без кавычек (обратите внимание на позицию открытия "
); что-то вроде set ARG1="%~1"
будет включать кавычки в значение переменной, с которой неудобно обращаться (представьте, что вы хотите объединить два значения: как будет выглядеть следующее, когда отдельные значения были заключены в кавычки? например, D:\%FDIR%\%FNAME%
) (don не используйте значения в кавычках - вместо этого поместите их в кавычки)
Примечание 2: не полагайтесь на это; что-то вроде set combined=%1%-%2%
с первым параметром alpha
и вторым с beta
будет интерпретировано как alpha2
(первый аргумент %1
, переменная * (вероятно, неопределенная) %-%
, литерал 2
и осиротевший %
, который игнорируется)
Примечание 3: (как прокомментировал @Mark) установка параметра для переменной в большинстве случаев не требуется, вы всегда можете ссылаться на него с помощью %1
или %~1
(при необходимости). Дополнительная переменная вам нужна только тогда, когда вы хотите выполнить с ней подстроки (это не работает с %1
)