2016-04-03 7 views
2

Erstellen Sie eine Batch-Datei mit folgendem Inhalt:Batch-Scripting: Warum wird diese Bedingung als wahr bewertet?

@echo off 
setlocal 

echo %1 
if [%1] == [] echo hi 

Dann ist es aus der Eingabeaufforderung wie folgt:

script.cmd == 

Es ist die folgende Ausgabe:

ECHO is off. 
hi 

Warum ist das und wie passiert es? Wie kann ich in meinen Batch-Scripts zuverlässiger nach leeren Strings suchen?

Danke.

+1

Das Kernproblem besteht darin, dass das Zeichen '=' ein Token-Trennzeichen wie auch _space_, _tab_, ',' und ';' darstellt, also verhält sich das Skript so, als ob es kein Argument gegeben hätte; Indem man es zwischen "" "setzt, hebt es ihre besondere Bedeutung auf und hält sie wörtlich; Der Zugriff auf die Argumente mit '% ~ 1' entfernt die Anführungszeichen ... – aschipfl

Antwort

2

In diesem Fall empfehle ich folgendes mit:

@echo off 
setlocal 

echo(%~1 
if "%~1"=="" echo hi 

Und statt script.cmd == Verwendung script.cmd "=="

Bitte beachte, dass ich verwenden echo(, die eine neue Zeile wird Echo, wenn die Variable als leer zu sehen ist, und dass ich %~1 verwendet, die umgebende Zitate aus dem %1 Argument entfernt.

Sie benötigen die umgebenden Anführungszeichen, weil ein equal-sign is treated as a delimeter in the arguments, außer in Anführungszeichen, genau wie Leerzeichen.

+0

Interessant! Ich wusste nichts von dem "Echo" -Trick. Danke für die kurze/informative Antwort! –

+2

Es gab eine große Diskussion über Dostips, und "echo." kann unbeabsichtigte Ergebnisse haben, wenn eine Datei mit dem Namen echo das Verzeichnis ist. Es ist besser, 'echo ('. – SomethingDark

+0

@SomethingDark du sprichst [this] (http://www.dostips.com/forum/viewtopic.php?f=3&t=774&start=0&hilit=echo+blank+line) Ich denke, ich habe es vorher nicht gelesen, aber nachdem ich es gelesen habe, stimme ich zu, dass 'echo (' 'in der Tat ist besser. –

1
@ECHO OFF 
SETLOCAL 
SET "cmdtail=%*" 
ECHO(%cmdtail% 
IF "%cmdtail%"=="==" ECHO two "=" 

Aber zurück zum ursprünglichen Problem.

Beachten Sie, dass diese Syntax das == erkennt, das als Befehlsende bereitgestellt wird, während %~1 nicht zu == ausgewertet wird.