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

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:
> 

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.