Batch Datei start Argumente auslesen?

3 Antworten

Mit

%[Argumentnummer]

Können die Parameter ausgelesen werden.

oh je💀👻☠🤭 die "Shifter" sind auferstanden... 🤣🤣🤣🤣🤣🤣

Es geht ganz ohne Shift. Man schaufelt alle Argumente der Batch einfach ohne Zwischenstopp per %* as string-Set in einen "nackten For-Lopp.

Die Laufvariable bekommt einen Parameter nach dem Anderen automatisch zugewiesen. Ganz ohne die Wuselei mit Shift.

Das größte Problem bei Shift ist:

Was einmal mit Shift "weggeschoben" wurde ist nicht mehr Zugreifbar. (Zumindest nicht mit %1)

Der Zugriff mit %* bleibt jedoch erhalten...

Es gibt noch Zahlreiche andere Problemchen... , Schwamm drüber... sift ist Mist!

Hier meine Implementation eines Droptarget:

Dateien auf die Batch ziehen und Fertig...

@echo off
chcp 65001 >nul & rem Umlaute ermöglichen
  rem abfragen ob mindestens  ein Parameter  übegeben wird
if "%~1"=="" (
    echo Diese Batch ist ein Droptarget.
    echo Markiere  eine  fast beliebige Menge an Dateien/Ordnern ...
    echo ^(Limit: alle Parameter zusammen dürfen die Länge  von 8100 Zeichen nicht überschreiten^) 
    echo ...und ziehe Diese auf diese Batch "%~nx0"
    Timeout 20 >nul
    exit /b
)
  rem hier gehts los...
for %%a in (%*) do (
  echo An Dieser stelle  würde ich die übergebene Datei  verarbeiten...
  echo Verarbeite "%%~a" .
  echo:
)
pause

Die Sache als Automatische Demo:

@echo off
setlocal enableDelayedExpansion
chcp 65001 >nul & rem Umlaute ermöglichen


  rem simuliere Batchaufruf duch den Aufruf einer Subroutine
  rem  einziger unterschied besteht im aufruf eines Label anstatt einer Datei
  rem Die Parameterübergabe ist die gleiche...


  rem man kann auch meher als 9 Parameter ohne Shift auswerten!
call :Subroutine_1   1 2 3 Rumpelheinzchen "Blah und Blub"  "%Temp%" 7 8 Bommelkopp "Pink Einhorn" 11 12 13 "14 & 15" irgendwas Schluß
echo:
echo named Argument Demo:
call :get_Named_arguments  "falsch hier fehlt" der Agumentname -Arg1 1 2 3 Rumpelheinzchen -Arg2 "Blah und Blub" -Arg3 "%Temp%"  -MachWas 7 8 Bommelkopp  -DerRest "Pink Einhorn" 11 12 13 "14 & 15" irgendwas Schluß
echo:
echo named Argument Demo2:
call :get_Named_arguments -Arg1 1 2 3
pause
exit /b
:::::::::: Hauptprogramm endet  hier :::::::::::::::::::


:Subroutine_1
  rem %* übergibt die gesammte  Komandozeile in einem Rutsch
  rem KomandozeilenElemente aufteilen und Anzeigen
  
for %%a in (%*) do (
    rem Zähler  
  set /a "counter+=1"
    rem Werte aus der Kommandozeile Speichern
  echo !counter!. Element  = %%~a
)
exit /b


:get_Named_Arguments
  rem  falls  am anfang  kein Bezeichner da ist? ...abfangen!
  rem Das ganze  ist  noch Verbesserungswürdig... aber  wollte s  simpel halten
set "arg=%%~a"
if "!arg:~0,1!" neq "-" ( set "NamedArg=-Unbekant = " )


for %%a in (%*) do (
      rem  1. Zeichem auf  "-" prüfen
    set "arg=%%~a"
    if "!arg:~0,1!"=="-" (
          rem zuvor gebastelte Zeichenkette  anzeigen
        echo !NamedArg!
          rem Zeichenkette beginnen
        set "NamedArg=%%a = "
    ) else (
          rem weitere Begriffe anfügen
        set "NamedArg=!NamedArg! %%a"
    )
)
  rem da  die Ausgabe  vom "-" abhängt  muss das letzte  "Bündel"  noch extra angezeigt werden...
echo !NamedArg!
exit /b


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Erzesel  21.09.2019, 20:51

ups 3 kleine Fehlerchen...

....

:get_Named_Arguments
 rem hier...
set "arg=%~1"
if "%arg:~0,1%" neq "-" ( set "NamedArg=-Unbekant = " )

for %%a in (%*) do (
  set "arg=%%~a"
  if "!arg:~0,1!"=="-" (
      rem hier
    if defined NamedArg echo !NamedArg!
      rem Zeichenkette beginnen
    set "NamedArg=%%a = "
  ) else (
    set "NamedArg=!NamedArg! %%a"
  )
)
  rem hier
if defined NamedArg echo !NamedArg!
set "NamedArg="
exit /b
....

Auf die ersten 8 Argumente kannst du folgendermaßen zugreifen:

echo.%1
echo.%2
echo....
echo.%9

Im nullten Parameter %0 ist der Pfad der aktuellen Batch enthalten.

Um auf weitere Parameter zuzugreifen (%10 wäre nämlich der Inhalt des ersten Arguments und eine 0), kannst du `shift` verwenden:

:Loop
    IF "%1"=="" GOTO Continue
        echo.%1
    SHIFT
GOTO Loop

:Continue
    echo. Alle Parameter ausgegeben.
    pause

Weitere Infos zu shift erhältst du, wenn du in cmd `shift /?` eingibst.

Allgemeine, umfassendere Informationen zu Parametern findest du z.B. hier: https://www.robvanderwoude.com/parameters.php


Erzesel  21.09.2019, 20:24

Leichenfledderer!😁😆😆 Mit Shift haben wir uns unter Dos gequählt seit NT4 gehts mit %* in der Schleife