порівняння рядків у пакетному файлі


75

Як ми порівняємо рядки, які отримали простір та спеціальні символи в командному файлі?

Я намагаюся:

if %DevEnvDir% == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"(
echo VS2010
)

Але це видає помилку "Файли в цей час були несподіваними".

Я намагався:

if "%DevEnvDir%" == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"(
echo VS2010
)

Але це видає помилку "Синтаксис команди неправильний."

Будь-які ідеї?


Судячи зі зв'язаної відповіді, ви могли б це зробити if [%DevEnvDir%] == ["C:\..."]. Посилання: stackoverflow.com/a/4953226/2428861
Младен Б.

Відповіді:


94

Просто поставте лапки навколо змінної Environment (як ви вже робили):
if "%DevEnvDir%" == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"
але це так, як ви ставите відкриваючу дужку без пробілу, що бентежить її.

Працює для мене ...

C:\if "%gtk_basepath%" == "C:\Program Files\GtkSharp\2.12\" (echo yes)
yes

4
дякую за підказку !! Помилкою, яку я зробив, було те, що між "string-value" & (. Зараз чудово працює! Дякую.
dushyantp

7
Здається, це не вдається, якщо змінна вже містить лапки. Наприклад: якщо "% 1" == "" перейти до довідки не вдається, якщо перший аргумент командного файлу вже містить подвійні лапки навколо нього.
MarioVilas

41

Хоча відповідь @ ajv-jsy працює більшу частину часу, у мене була та сама проблема, що і @MarioVilas. Якщо одна із рядків для порівняння містить подвійну лапку ("), змінна розширення видає помилку.

Приклад:

@echo off
SetLocal

set Lhs="
set Rhs="

if "%Lhs%" == "%Rhs%" echo Equal

Помилка:

echo was unexpected at this time.

Рішення:

Увімкніть відкладене розширення та використання! замість %.

@echo off
SetLocal EnableDelayedExpansion

set Lhs="
set Rhs="

if !Lhs! == !Rhs! echo Equal

:: Surrounding with double quotes also works but appears (is?) unnecessary.
if "!Lhs!" == "!Rhs!" echo Equal

Дотепер я не зміг його зламати, використовуючи цю техніку. Він працює з порожніми рядками та всіма символами, які я на нього кинув.

Тест:

@echo off
SetLocal EnableDelayedExpansion

:: Test empty string
set Lhs=
set Rhs=
echo Lhs: !Lhs! & echo Rhs: !Rhs!
if !Lhs! == !Rhs! (echo Equal) else (echo Not Equal)
echo.

:: Test symbols
set Lhs= \ / : * ? " ' < > | %% ^^ ` ~ @ # $ [ ] & ( ) + - _ =
set Rhs= \ / : * ? " ' < > | %% ^^ ` ~ @ # $ [ ] & ( ) + - _ =
echo Lhs: !Lhs! & echo Rhs: !Rhs!
if !Lhs! == !Rhs! (echo Equal) else (echo Not Equal)
echo.

спробуйте це >>> @echo off setlocal EnableDelayedExpansion set Lhs = "hello" set Rhs = "hello" if! Lhs! == "привіт" (ехо 1Equal) :: Оточення подвійними лапками також працює, але виявляється (є?) непотрібним. якщо "! Lhs!" == "привіт" ехо Рівний тайм-аут 10 ендлокальна пауза
Субхем Тріпаті

3
Ви можете використати, if /Iякщо хочете зробити порівняння рядків без чутливих регістрів
Carlos P

-4

Рішення - НЕ ВИКОРИСТОВУВАТИ ПРОСТОРИ!

IF "%DevEnvDir%"=="C:\" (

3
Це неправильно. Ви можете використовувати пробіли, якщо ви їх цитуєте. Проблемою було відсутність місця в кінціif "%env%"=="xyz"<space>(
2016 року
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.