Ein fortgeschrittenes Beispiel:
unendliche Argumente.
existieren im Dateisystem (entweder als Datei
oder Verzeichnis
?) oder als generischer String
.
spezifizieren, ob es eine Datei ist
spezifizieren, ob es ein Verzeichnis ist
keine Erweiterungen, funktioniert in Legacy-Skripten!
minimaler Code
@echo off
:schleife
::-------------------------- hat Argument ?
if \["%~1"\]==\[""\] (
echo fertig.
goto ende
)
::-------------------------- Argument existiert ?
if not exist %~s1 (
echo existiert nicht
) else (
echo existiert
if exist %~s1\\NUL (
echo ist ein Verzeichnis
) else (
echo ist eine Datei
)
)
::--------------------------
shift
goto schleife
:ende
pause
andere Sachen..
in %~1
- das ~
entfernt jegliche umschließenden "
oder '
.
in %~s1
- das s
macht den Pfad zu DOS 8.3-Namen
, was ein netter Trick ist, um Leerzeichen im Dateinamen zu vermeiden während des Überprüfens von Sachen (und auf diese Weise ist kein zusätzliches Einwickeln der Ressource mit mehreren "
s erforderlich).
das ["%~1"]==[""]
"kann nicht sicher sein", ob das Argument eine Datei/Verzeichnis ist oder nur ein generischer String, daher verwendet der Ausdruck Klammern und das originale unveränderte %1
(nur ohne das "
Einwickeln, falls vorhanden..)
wenn es keine Argumente gab oder wenn wir shift
verwendet haben und der Argument-Liste-Zeiger das letzte überschritten hat, wird der Ausdruck zu [""]==[""]
ausgewertet.
das ist so spezifisch, wie man sein kann, ohne weitere Tricks zu verwenden (es würde sogar in Batch-Skripts von windows-95 funktionieren...)
Ausführungsbeispiele
speichern Sie es als identifier.cmd
es kann eine unendliche Anzahl von Argumenten identifizieren (normalerweise sind Sie auf %1
-%9
beschränkt), denken Sie nur daran, die Argumente mit umgekehrten Anführungszeichen zu umschließen, oder verwenden Sie 8.3-Namen, oder ziehen Sie sie darüber (es macht automatisch eines der oben genannten).
dadurch können Sie die folgenden Befehle ausführen:
identifier.cmd c:\windows
und erhalten
existiert
ist ein Verzeichnis
fertig.
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
und erhalten
existiert
ist eine Datei
fertig.
und mehrere Argumente (natürlich ist das die ganze Sache..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
und erhalten
existiert
ist ein Verzeichnis
existiert
ist eine Datei
existiert
ist eine Datei
existiert nicht
fertig.
natürlich kann es viel komplexer sein, aber schöne Beispiele sollten immer einfach und minimal sein. :)
Hoffentlich hilft es jemandem :)
veröffentlicht hier:<a href="http://icompile.eladkarako.com/cmd-unlimited-arguments-identifying-directory-file-or-none/" rel="noreferrer">CMD Ninja - Unbegrenzte Argumentverarbeitung, Identifizierung, ob im Dateisystem vorhanden, Identifizierung als Datei oder Verzeichnis</a>
und hier ist ein funktionierendes Beispiel, das beliebig viele APK-Dateien (Android-Apps) akzeptiert und sie über die Debug-Konsole (ADB.exe) auf Ihrem Gerät installiert: <a href="http://icompile.eladkarako.com/mass-apk-installer-wo-adb-install-multi/" rel="noreferrer">Machen Sie den vorherigen Beitrag zu einem Massen-APK-Installer, der die Syntax ADB Install-Multi nicht verwendet</a>
0 Stimmen
Möglicher Duplikat von Was ist der richtige Weg, um zu testen, ob ein Parameter in einer Batch-Datei leer ist?
1 Stimmen
@double-beep - Die Frage hier (von daniel-fortunov) wurde zuerst gestellt, etwa ein Jahr bevor die Frage, auf die Sie sich beziehen, veröffentlicht wurde. Welches ist das (mögliche) Duplikat?
1 Stimmen
@KevinFegan, weil die andere Frage mehr Aufrufe und mehr Antworten hat.