При использовании% 1 важно поместить что-то вокруг него, чтобы предотвратить разрыв пакетного файла, когда% 1 пуст, потому что% 1 не является переменной, он заменяется значением, как, например, SQL-инъекция , пример внедрения в пакет, и когда значение равно нулю, а% 1 находится в IF, вы получаете неработающий код. if %1==""
становится if == ""
и выдает ошибку.
Что касается того, почему, если определено, не работает на% 1,% 1 является значением, а не переменной, поэтому определение там не работает. Для того, чтобы код, который работает для% 1, был пустым, вам нужен код, который не сломается, когда% 1 заменяется ничем. Попробуйте, if "%1"==""
или попробуйте, if [%1]==[]
Сказать, что% 1 выглядит немного запутанно, для меня это не выглядит хорошим соглашением! Технически это можно сделать даже в том if a%1==a%1
или if %1a==%1a
но обычно используется []
Вы можете использовать кавычки, или [] или любой другой символ (ы). Но, как указал суперкат в комментарии, кавычки не являются хорошей идеей для% 1. (Поскольку, если% 1 содержит пробелы, пользователь включает кавычки в то, что передается, чтобы быть% 1, и если в% 1 и в пакетном файле есть пробел, вы помещаете кавычки вокруг% 1, кавычки будут отменены и пробел без кавычек там вызовет ошибку).
Если вы выполняли IF в командной строке и не тестировали какую-либо переменную, у вас не было бы% 1 и вам даже не понадобилось бы []. Вы скажете, IF "a b c"=="a b c" echo a
или IF a==b echo a
Если в пакетном файле у вас часто есть% 1, и вместо использования кавычек вокруг% 1, используйте, например, один или два символа вокруг него, например [%1]
и используйте кавычки, если вам нужно сохранить пробелы, а это не% 1 эгег IF [%1]==[a]
или IF [%1]==["a b"] echo a
Не делать "%1"
потому что% 1 может уже иметь кавычки, которые будут отменены вашими кавычками, а затем, если % 1 имеет пробел, который прерывает оператор if.
Если вы были в командной строке и тестировали переменную, то это зависит от того, есть ли у переменной кавычки. Вы можете посмотреть на содержание.
Переменная может иметь пробел и не содержать кавычек.
Таким образом, в этом конкретном случае командной строки, размещение кавычек около% a% не приведет к двойным кавычкам, и вы должны поместить кавычки вокруг% a%, если вы хотите проверить его на "a b".
C:\>set a=a b
C:\>echo %a%
a b
C:\>IF %a%=="a b" echo sdf
b=="a b" was unexpected at this time.
C:\>IF "%a%"=="a b" echo sdf
sdf
So ^^^ we want "%a%"
Тогда как если бы% a% содержал кавычки, это был бы другой случай
C:\>set a="a b"
C:\>echo %a%
"a b"
C:\>IF %a%=="a b" echo a
a
C:\>IF "%a%"=="a b" echo a
b""=="a b" was unexpected at this time.
C:\>
^^^^ So there we want %a% without quotes around it.
Так что все дело в том, содержит ли переменная или параметр кавычки. Если в% 1 есть пробелы, он будет содержать кавычки. Итак, мы знаем, что если бы мы сравнивали% 1 с "a b", то w не делал бы «% 1». И если бы% 1 не содержал кавычек, он не содержал бы пробелов, поэтому мы бы не делали «% 1», поэтому я думаю, что вы никогда не захотите делать «% 1». Таким образом, если% 1 содержит пробелы, в% 1 будут кавычки, и пробелы уже будут сохранены.
Я вычеркнул ниже в свете комментария суперкатера. И я добавил больше к своему посту выше.
Кавычки лучше всего использовать% 1, а не [] или какой-либо символ, такой как A или -, потому что, например, если вы используете [], то это не сохранит пробелы
C:\> if [dab] == [dab] echo sdf
в это время было неожиданно.
Скажите, if "d a b"
что будет работать. Поэтому, if "%1"
лучше, чем другие символы, например, if [%1]
или a%1a
или -%1