Wie kann ich überprüfen, ob ein Argument definiert wird beim Starten / eine Batch-Datei aufrufen?

StackOverflow https://stackoverflow.com/questions/830565

  •  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?

War es hilfreich?

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 oder directory?) Oder ein generisches string.

     

⍟ 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top