Zeichenfolgenvergleich in Batchdatei

75

Wie vergleichen wir Zeichenfolgen, die Speicherplatz und Sonderzeichen in der Batch-Datei enthalten?

Ich versuche:

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

Es wird jedoch der Fehler "Dateien waren zu diesem Zeitpunkt unerwartet" angezeigt.

Ich habe es versucht:

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

Es wird jedoch der Fehler "Die Syntax des Befehls ist falsch" angezeigt.

Irgendwelche Ideen?

dushyantp
quelle
Nach der verknüpften Antwort zu urteilen, könnten Sie tun if [%DevEnvDir%] == ["C:\..."]. Link: stackoverflow.com/a/4953226/2428861
Mladen B.

Antworten:

94

Setzen Sie einfach Anführungszeichen um die Umgebungsvariable (wie Sie es getan haben):
if "%DevEnvDir%" == "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"
Aber es ist die Art und Weise, wie Sie die öffnende Klammer ohne ein Leerzeichen setzen, das sie verwirrt.

Funktioniert bei mir...

C:\if "%gtk_basepath%" == "C:\Program Files\GtkSharp\2.12\" (echo yes)
yes
AjV Jsy
quelle
4
danke für den Tipp!! Der Fehler, den ich gemacht habe, war, dass zwischen "string-value" und (. Funktioniert jetzt
einwandfrei
7
Dies scheint fehlzuschlagen, wenn die Variable bereits Anführungszeichen enthält. Beispiel: Wenn "% 1" == "" "Gehe zu Hilfe" fehlschlägt, wenn das erste Argument für die Batchdatei bereits doppelte Anführungszeichen enthält.
MarioVilas
41

Während die Antwort von @ ajv-jsy die meiste Zeit funktioniert, hatte ich das gleiche Problem wie @MarioVilas. Wenn eine der zu vergleichenden Zeichenfolgen ein doppeltes Anführungszeichen (") enthält, gibt die Variablenerweiterung einen Fehler aus.

Beispiel:

@echo off
SetLocal

set Lhs="
set Rhs="

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

Error:

echo was unexpected at this time.

Lösung:

Aktivieren Sie die verzögerte Erweiterung und Verwendung! Anstatt von %.

@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

Ich konnte es bisher mit dieser Technik nicht brechen. Es funktioniert mit leeren Zeichenfolgen und allen Symbolen, die ich darauf geworfen habe.

Prüfung:

@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.
Skataben
quelle
versuchen Sie dies >>> @echo aus setlocal EnableDelayedExpansion set Lhs = "hallo" set Rhs = "hallo" wenn! Lhs! == "Hallo" (Echo 1Equal) :: Das Umgeben mit doppelten Anführungszeichen funktioniert ebenfalls, erscheint aber (ist?) unnötig. wenn "! Lhs!" == "Hallo" Echo Gleiches Timeout 10 endlokale Pause
Subham Tripathi
3
Sie können verwenden, if /Iwenn Sie einen Zeichenfolgenvergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen möchten
Carlos P
-4

Die Lösung lautet: KEINE RAUME VERWENDEN!

IF "%DevEnvDir%"=="C:\" (
Bernardo Ravazzoni
quelle
3
Das ist falsch. Sie können Leerzeichen verwenden, solange Sie sie zitieren. Das Problem war der fehlende Platz am Endeif "%env%"=="xyz"<space>(
jeb