Ich versuche, die folgende Validierungslogik in einer Batchdatei zu verwenden, aber der Block "usage" wird nie ausgeführt, selbst wenn der Batchdatei kein Parameter angegeben wird.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
Was mache ich falsch?
batch-file
arguments
Daniel Fortunov
quelle
quelle
Antworten:
Die Prüfung auf , ob ein Kommandozeilen - Argument kann eingestellt wurde sein
[%1]==[]
, aber, wie Dave Costa weist darauf hin ,"%1"==""
wird auch funktionieren.Ich habe auch einen Syntaxfehler im Verwendungsecho behoben, um den Zeichen größer als und kleiner als zu entkommen. Darüber hinaus wird die
exit
Notwendigkeit eines/B
Arguments ansonstenCMD.exe
beendet.quelle
set
Variablen verwenden (ich kenne die richtige Batch-Terminologie nicht), diese möglicherweise verwenden möchten,"%myvar%"==""
damyvar
Sie zu diesem Zeitpunkt das "Unerwartete" erhalten, wenn Leerzeichen darin sind und nicht in Anführungszeichen gesetzt werden " Botschaft.IF NOT DEFINED VarName
Block überprüft werden . Auch +1 nach Tukushan, weil im Vergleich keine Anführungszeichen verwendet werden. Tu es einfach nicht. Noch nie."%~1"==""
wird auch funktionieren und sich um den Fall kümmern, in dem% 1 doppelte Anführungszeichen hat"%~1"==""
behandelt Leerzeichen in der Variablen, während die[]
Version dies nicht tut.✨ andere Sachen..✨
■ in
%~1
- das~
entfernt jegliche Umhüllung"
oder'
.■ in
%~s1
- dass
macht den PfadDOS 8.3 naming
, was ein guter Trick ist, um Leerzeichen im Dateinamen zu vermeiden, während Dinge überprüft werden (und auf diese Weise muss die Ressource nicht mit mehr"
s umbrochen werden .■ das
["%~1"]==[""]
"kann nicht sicher sein", ob das Argument noch eine Datei / ein Verzeichnis oder nur eine generische Zeichenfolge ist. Stattdessen verwendet der Ausdruck Klammern und das Original unverändert%1
(nur ohne"
Umbruch, falls vorhanden).Wenn es keine Argumente dafür gab, ob wir verwendet haben
shift
und der Zeiger auf die Argumentliste den letzten übergeben hat, wird der Ausdruck ausgewertet[""]==[""]
.■ Dies ist so spezifisch, wie Sie es können, ohne weitere Tricks zu verwenden (es würde sogar in den Batch-Skripten von Windows-95 funktionieren ...)
■ Ausführungsbeispiele
Speichern Sie es als
identifier.cmd
Es kann eine unbegrenzte Anzahl von Argumenten identifizieren (normalerweise sind Sie auf
%1
- beschränkt%9
). Denken Sie jedoch daran, die Argumente mit Anführungszeichen zu versehen oder die 8.3-Benennung zu verwenden oder sie per Drag & Drop zu verschieben (dies geschieht automatisch oben).Auf diese Weise können Sie die folgenden Befehle ausführen:
⓵
identifier.cmd c:\windows
und zu bekommen⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
und zu bekommen⓷ und mehrere Argumente (das ist natürlich die ganze Sache ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
und zu bekommen
Natürlich kann es viel komplexer sein, aber schöne Beispiele sollten immer einfach und minimal sein. :) :)
Hoffe es hilft jedem :)
hier veröffentlicht: CMD Ninja - Unbegrenzte Argumentverarbeitung, Identifizieren, ob im Dateisystem vorhanden, Identifizieren, ob Datei oder Verzeichnis
und hier ist ein funktionierendes Beispiel, das eine beliebige Anzahl von APK-Dateien (Android-Apps) verwendet und über die Debug-Konsole (ADB.exe) auf Ihrem Gerät installiert: Machen Sie den vorherigen Beitrag zu einem Massen-APK-Installationsprogramm, das keine ADB Install-Multi-Syntax verwendet
quelle
Entfernen Sie die Klammern.
Beispiel-Batch-Datei:
Ausgabe von oben ausgeführtem Skript:
Ich denke, es braucht tatsächlich die Klammern, um Teil der Zeichenfolgen zu sein, und sie werden verglichen.
quelle
if "%1"==""
stürzt ab, wenn das Argument Leerzeichen enthält. Zum Beispiel :run.bat "a b"
. @amr hat die beste Antwort zu verwendenif "%~1"==""
~ wird% 1 dekotieren, wenn% 1 selbst in Anführungszeichen gesetzt wird.
"" schützt vor übergebenen Sonderzeichen. Zum Beispiel das Skript mit & ping aufrufen
quelle
run.bat "a b"
run.bat ""
wird nicht mit gefangen[%1]==[]
.quelle
run.bat "a b"
Dies ist dasselbe wie bei den anderen Antworten, verwendet jedoch nur ein Etikett und stellt die Verwendung an die erste Stelle, wodurch es zusätzlich als eine Art Dokumentationsempfehlung für das Skript dient, das normalerweise auch oben platziert wird:
Wenn Sie jedoch nicht cmd / batch, bash für WSL oder Powershell verwenden müssen, verfügen sie über eine vernünftigere Syntax und weniger arkane Funktionen.
quelle
WENN "% 1" == "" fehlschlägt, schlagen alle Versionen unter bestimmten Bedingungen für Giftcharaktere fehl. Nur WENN DEFINIERT oder WENN NICHT DEFINIERT, sind sicher
quelle
if [not] defined ...
funktioniert nicht mit Parametern wie%1
. Haben Sie ein Beispiel, woif "%~1" ...
es nicht funktioniert?