Wie kann ich überprüfen, ob ein Argument definiert wird beim Starten / eine Batch-Datei aufrufen?
-
06-07-2019 - |
Frage
Ich versuche, die folgende Validierungslogik in einer Batch-Datei zu verwenden, aber der „Verwendung“ Block nie ausgeführt wird, auch wenn kein Parameter für die Batch-Datei geliefert 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?
Lösung
Die Prüfung auf, ob ein Kommandozeilen-Argument gesetzt wurde, kann [%1]==[]
werden, aber, wie Dave Costa weist darauf hin, , "%1"==""
wird auch funktionieren.
Ich reparierte auch einen Syntaxfehler in dem Nutzungs Echo der Größer-als und weniger als Zeichen zu entkommen. Darüber hinaus muss die exit
ein /B
Argument sonst CMD.exe
verlassen wird.
@echo off
if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
Andere Tipps
Ein-komplexeres Beispiel:
⍟ unbegrenzte Argumente.
⍟ auf Dateisystem vorhanden (entweder
file
oderdirectory
?) Oder ein generischesstring
.⍟ angeben, ob eine Datei
⍟ angeben ist ein Verzeichnis
⍟ nicht Erweiterungen, würden in Legacy-Skripten arbeiten!
⍟ minimal Code ☺
@echo off :loop ::-------------------------- has argument ? if ["%~1"]==[""] ( echo done. goto end ) ::-------------------------- argument exist ? if not exist %~s1 ( echo not exist ) else ( echo exist if exist %~s1\NUL ( echo is a directory ) else ( echo is a file ) ) ::-------------------------- shift goto loop :end pause
✨ andere stuff..✨
■ in %~1
-. Die ~
entfernt jede Verpackung "
oder '
■ in %~s1
-. Die s
machen den Weg DOS 8.3 naming
werden, was ein netter Trick ist, Leerzeichen in Dateinamen zu vermeiden, während Sachen Kontrolle (und auf diese Weise keine Notwendigkeit, die Ressource mit mehr "
s zu wickeln
■ die ["%~1"]==[""]
„kann nicht sicher sein“, wenn das Argument eine Datei / Verzeichnis oder nur eine generische String noch, so dass anstelle der Ausdruck verwendet Klammern und den ursprünglichen unveränderten %1
(nur ohne die "
Verpackung, falls vorhanden ..)
wenn es keine Argumente, wenn wir shift
und der arg-Listenzeiger vergangen die letzten verwendet haben, wird der Ausdruck [""]==[""]
ausgewertet werden.
■ dies so viel spezifisch ist man ohne weitere Tricks sein kann (es funktionieren würde, auch in Windows-95s Batch-Skripte ...)
■ Ausführungsbeispiele
speichern Sie es als identifier.cmd
kann es ein unbegrenztes Argument identifizieren (in der Regel sind Sie darauf beschränken %1
-%9
), nur nicht vergessen, die Argumente mit umgekehrten Kommas zu wickeln, oder 8.3-Namen verwenden, oder per Drag & Drop über (es automatisch funktioniert entweder von oben).
Damit können Sie die folgenden Befehle ausführen:
⓵identifier.cmd c:\windows
und bekommen
exist is a directory done
⓶identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
und bekommen
exist is a file done
⓷ und mehr Argumente (natürlich ist dies der ganze-Deal ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
und bekommen
exist is a directory exist is a file exist is a file not exist done.
natürlich kann es viel komplexer sein, aber schöne Beispiele sollten immer einfach und minimal sein .)
Hoffe, es hilft jemand:)
veröffentlicht hier: CMD Ninja - Unbegrenzte Argumente Processing, Identifizierung wenn existiert in Datei-System identifiziert wenn Datei oder das Verzeichnis
und hier ist ein funktionierendes Beispiel, dass jede Menge von APK-Dateien (Android Apps) und installiert sie über Debug-Konsole (ADB.exe) auf dem Gerät nimmt: Stellen der früheren Post Eine Massen APK Installer, das nicht Verwendet ADB Install-Multi Syntax
Sie sich von den Klammern befreien.
Beispielbatchdatei:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
Ausgabe von oben Skript ausgeführt wird:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
Ich denke, es ist eigentlich die Klammern der Teilnahme der Saiten zu sein, und sie verglichen werden.
IF "%~1"=="" GOTO :Usage
~ wird de-quote% 1% 1, wenn selbst zitiert wird.
“" wird von Sonderzeichen bestanden schützen. zum Beispiel das Skript mit & Ping-Aufruf
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
IF „% 1“ == „“ wird fehlschlagen, werden alle Versionen dieses fehl unter bestimmte Gift Charakter Bedingungen. Nur wenn DEFINIERT oder WENN NICHT sicher DEFINIERT ist
Dies ist das gleiche wie die anderen Antworten, nutzt aber nur ein Etikett und setzt die Nutzung ersten, was sie zusätzlich macht als eine Art Dokumentation commend des Skripts dienen, die auch in der Regel an der Spitze platziert wird:
@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo param%%1 the file to operate on
echo param%%1 another file
:: --------------------------
exit /B 1
:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...
Wenn Sie jedoch müssen cmd / Batch nicht verwenden, verwenden bash auf WSL oder Powershell, sie haben mehr sane Syntax und weniger obskuren Funktionen.