Якщо заяви, що спричиняють збій пакетного файлу?


0

У мене виникають проблеми з використанням тверджень IF у пакетному файлі. У мене він встановлений з набором / p, але коли код потрапляє до оператора IF, він закривається. Цей файл окреслює, що я маю на увазі:

@echo off  
set res1=word  
echo put in word.  
set /p ui=  
if %ui%==%res1% (goto oh)  
echo You put nothing in!  
pause  
:oh  
echo oh.  
pause

Якщо його запустити і нічого не вводити, він збивається, НЕ повторюючи текст і не зупиняючись. Що я роблю неправильно?


1
Яка версія Windows? У Windows 7 я не бачу збоїв. Або що саме ви маєте на увазі під Crash?
Вернер Гензе

Відповіді:


3

Це поширена проблема багатьох мов сценаріїв. Проблема полягає в тому, що імена змінних розширюються до їх значень перед виконанням рядка. Якщо змінну залишити порожньою, сценарій запустить код:

if ==word (goto oh)

Два знаки рівності не розбираються як оператор рівності, оскільки ІФ розраховує знайти предмет для порівняння з обох сторін. Замість цього (gotoоператор, як EQUочікується, і повідомлення про помилку відображатиме це.

Аналогічна проблема виникне, якщо користувач введе рядок, що містить пробіли, наприклад:

if what I typed==word (goto oh)

Така поведінка може використовуватися для різного роду брудного коду. В якості прикладу, умова буде оцінювати справжнє значення, якщо користувач вводить «слово», а й , якщо він входить в «== слово EQU», в цьому випадку рядок буде розібрана як: if ==word EQU ==word (goto oh). Як правило, ми не хочемо мати справу з цими крайніми випадками занадто широко і можемо уникнути проблем з порожніми змінним шляхом додавання фіктивних символів, наприклад: if %a%dummy==%b%dummy. Таким чином, синтаксис буде дійсним, навіть якщо одна (або обидві) змінних порожні. У пакетних файлах особливо корисним символом манекена є "-символ, оскільки він також запобігає розбору пробілів як роздільники. Наступний код повинен бути значно надійнішим:

if "%ui%"=="%word%" (goto oh)

О, так. Цитати мають певну користь. Я завжди думав, що вони просто виглядають краще :)
Майкл

+1, Ще одним поліпшенням буде явне очищення поточного значення, uiперш ніж запросити значення. Щоб очистити значення, використовуйте set "ui=". SET / P зберігає поточне значення, якщо користувач нічого не вводить.
dbenham

2
If x%ui%x==x%res1%x

Не обов’язково бути x. Це просто хитрість, щоб дозволити порожній кінець var.

Я зазвичай використовую, "%ui%"=="%res1%"тому що це більше схоже на справжню мову.

Про це я дізнався з ss64.com . Колись давно. Чудовий сайт.

Редагувати: Квадратні дужки - це більш безпечний варіант, як зазначено нижче.


1

Рішення Майкла, щоб додати подвійні лапки, може бути проблематичним, якщо значення, яке ви тестуєте, має в ньому подвійні лапки. Менш імовірним способом виникнення проблем буде використання квадратних дужок:

IF [%1]==[/?] ...

З сайту Роб Ван дер Вуде

Якщо сам% 1 може містити лапки, ви неприємні: якщо% 1 дорівнює "/?" включаючи цитати, ЯКЩО "% 1" == "/?" ... оцінює, якщо IF "" /? "" == "/?" ... що генерує повідомлення про помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.