Behandlung von goto-Befehlsfehlern in Batch

4

Um direkt zum Problem zu gelangen, muss eine Batch-Datei nicht automatisch geschlossen werden, wenn mein goto-Befehl ungültig ist (goto nicht vorhandener Ort) und ich danach eine Pause habe

Hier ist der Abschnitt:

set /p Command=
goto %Command%
pause

Danke Pizza

Pizza
quelle

Antworten:

3
  • In dieser sichereren Version werden zuerst alle Labels in einer Zeichenfolge direkt nacheinander erfasst.
  • Der Doppelpunkt des nächsten Etiketts kennzeichnet das Ende des vorherigen.
  • Die Zeichenfolge %Labels%und ein Doppelpunkt werden an den Findstr weitergegeben. Die eingegebene Bezeichnung wird ebenfalls mit einem Doppelpunkt versehen, sodass nur vollständige Bezeichnungen abgeglichen werden.

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

Set "Labels="&For /f %%A in ('findstr /i "^:[a-z]" %0') Do Set "Labels=!Labels!%%A"

:redo
Set "Label="&set /p "Label=Choose label %Labels%:"
if not defined Label goto :Eof
Echo %Labels%:|findstr /i ":%Label::=%:" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
Echo we'll never reach here

:One
Echo Label One
goto :redo

:Two
Echo Label Two
goto :redo

:Three
Echo Label Three
goto :redo

Beispielausgabe:

> SU_1204527.cmd
Choose label :redo:One:Two:Three:one
Label One
Choose label :redo:One:Two:Three:two
Label Two
Choose label :redo:One:Two:Three:blah
invalid label blah
Choose label :redo:One:Two:Three:
> 
LotPings
quelle
Könnten Sie bitte erklären, wie dies besser / sicherer ist als das obige, wenn es einen guten Grund gibt, werde ich Ihr verwenden, wenn nicht sein kompakter ist :)
Pizza
Sie gehören mir beide :-) Wenn es zwei Labels gibt :Test1 and : Test2`` und der Benutzer testdie andere Antwort eingibt, schlägt dies fehl - diesmal nicht.
LotPings
Ich habe nie bemerkt, dass sie beide von dir waren. Danke auch für die Erklärung
Pizza
4
:redo
set /p "Label=goto label:"
findstr /i "^:%Label%" "%~0" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
pause

Bearbeiten Ich muss zugeben, dass der Stapel fehlschlägt, wenn das eingegebene Etikett ein Anfangssubstring eines aktuellen Etiketts ist.

LotPings
quelle