batch shift cmd
%* problem
hiho
schnell erklärtes problem
c:\batch.bat alpha beta gamma delta
batch.bat
@echo off
cls
echo %*
es soll "alpha" übersprungen werden
ergo shiften wir
@echo off
cls
shift /1
echo %1 %2 %3
kann ich nun %1 %2 %3 zusammenfassen - %* geht dann nicht ?
oder
wie kann ich %10 %11 ... angeben?
thx
andre
hiho
schnell erklärtes problem
c:\batch.bat alpha beta gamma delta
batch.bat
@echo off
cls
echo %*
es soll "alpha" übersprungen werden
ergo shiften wir
@echo off
cls
shift /1
echo %1 %2 %3
kann ich nun %1 %2 %3 zusammenfassen - %* geht dann nicht ?
oder
wie kann ich %10 %11 ... angeben?
thx
andre
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 89799
Url: https://administrator.de/forum/batch-shift-cmd-89799.html
Ausgedruckt am: 22.04.2025 um 08:04 Uhr
17 Kommentare
Neuester Kommentar

moin,
das, was ich aus deinem schnell erklärten Problem herausgelesen habe ist
... aber das meintest du nicht - oder doch???
das, was ich aus deinem schnell erklärten Problem herausgelesen habe ist
echo %1 %2 %3
set alle = %1 %2 %3
set alle
... aber das meintest du nicht - oder doch???
Moin quakeMarine1,
und ohne FOR-Anweisung so:
Demo:
... wobei nun die ganze Visualisierung nur zeigen soll, dass Du auch mit mehr als 10 Parametern im Batch umgehen kannst.
Der (theoretische) Nachteil von bastlas eleganterer Lösung ist, dass die FOR /F-Anweisung selbst nur mit Token1 bis ca. Token31 arbeiten kann.
Für "beliebig viele" Aufrufparameter musst Du wirklich mit SHIFT rumkaspern.
wobei es ausser den paar Mitlesern gar nicht mehr viele wissen, dass es so ein Kommando gibt.
Grüße
Biber
und ohne FOR-Anweisung so:
::------snipp Shifttest.cmd
@echo off & setlocal
Set /a cnt=1
:top
if [%~1] neq ( @echo Parm_%cnt%: [%1] ) ELSE goto :eof
shift /1
Set /a cnt+=1
goto :top
::------snapp Shifttest.cmd
>>Shifttest.cmd a b c d e ff gg hh ii jj kk ll mm nn oo pp qq rr
Parm_1: [a]
Parm_2: [b]
Parm_3: [c]
Parm_4: [d]
Parm_5: [e]
Parm_6: [ff]
Parm_7: [gg]
Parm_8: [hh]
Parm_9: [ii]
Parm_10: [jj]
Parm_11: [kk]
Parm_12: [ll]
Parm_13: [mm]
Parm_14: [nn]
Parm_15: [oo]
Parm_16: [pp]
Parm_17: [qq]
Parm_18: [rr]
Der (theoretische) Nachteil von bastlas eleganterer Lösung ist, dass die FOR /F-Anweisung selbst nur mit Token1 bis ca. Token31 arbeiten kann.
Für "beliebig viele" Aufrufparameter musst Du wirklich mit SHIFT rumkaspern.
wobei es ausser den paar Mitlesern gar nicht mehr viele wissen, dass es so ein Kommando gibt.
Grüße
Biber

Hi,
das dumme ist doch, gibst du die Parameter in "" an, ist es nur noch einer ;-(
Was genau mußt du denn machen?
"So" Horror finde ich die beiden Ansätze nun nicht wirklich.
das dumme ist doch, gibst du die Parameter in "" an, ist es nur noch einer ;-(
Was genau mußt du denn machen?
"So" Horror finde ich die beiden Ansätze nun nicht wirklich.
Moin Quakemarine1,
dann reduziere meine Variante oben auf diese Mimik:
...ergibt.
Passt?
Grüße
Biber
P.S. Wenn Du meinst, das wären Horror-Skripte....
... dann besuch mich mal zu Hause...
dann reduziere meine Variante oben auf diese Mimik:
::------snipp NochnShifttest.cmd
@echo off & setlocal
Set /a cnt=1
:top
if "%~1" neq "" ( @echo Parm_%cnt%: [%~1] ) ELSE goto :eof
shift /1
Set /a cnt+=1
goto :top
::------snapp NochnShifttest.cmd
>NochnShifttest.cmd alpha "beta gamma delta eta"
Parm_1: [alpha]
Parm_2: [beta gamma delta eta]
Passt?
Grüße
Biber
P.S. Wenn Du meinst, das wären Horror-Skripte....
... dann besuch mich mal zu Hause...
@Biber
... obwohl: Bei Verwendung von Anführungszeichen für die Parameter 2 bis x könnte die "NochnShifttest.cmd" eigentlich auch so aussehen:
@QuakeMarine1
Kannst Du denn Anwendung A dazu überreden, alles nach dem ersten Parameter in Anführungszeichen einzuschließen?
Grüße
bastla
... obwohl: Bei Verwendung von Anführungszeichen für die Parameter 2 bis x könnte die "NochnShifttest.cmd" eigentlich auch so aussehen:
@echo off & setlocal
echo Parm_1: [%~1]
echo Parm_2: [%~2]
Kannst Du denn Anwendung A dazu überreden, alles nach dem ersten Parameter in Anführungszeichen einzuschließen?
Grüße
bastla
Moin QuakeMarine1,
Wenn doch aber, wie Du schreibst...
Fakt ist jedenfalls, dass im Batch durch die SHIFT-Anweisung aus Parameter %2 der Parameter %1, aus %3 der Parameter %2 wird etc, aber der Parameter %* immer gleich %* bleibt. Das ist halt so implementiert. Wenn wir an der Stelle keinen Workaround finden, dann mussen wir eben die Strategie ändern.
Grüße
Biber
Wenn doch aber, wie Du schreibst...
for /f "tokens=1*" %%i in ("%*") do "C:\pfad zur.exe" %%j
gibt mir übersetzt aus
"C:\pfad zur.exe" test\info.txt" -nogui -render ...
soll aber sein
"C:\pfad zur.exe" -nogui -render ...
...Reicht es dann nicht, das "tokens=1*" in ein "Token=2*" zu ändern?gibt mir übersetzt aus
"C:\pfad zur.exe" test\info.txt" -nogui -render ...
soll aber sein
"C:\pfad zur.exe" -nogui -render ...
Fakt ist jedenfalls, dass im Batch durch die SHIFT-Anweisung aus Parameter %2 der Parameter %1, aus %3 der Parameter %2 wird etc, aber der Parameter %* immer gleich %* bleibt. Das ist halt so implementiert. Wenn wir an der Stelle keinen Workaround finden, dann mussen wir eben die Strategie ändern.
Grüße
Biber
Hallo QuakeMarine1!
Wie schon oben festgestellt, bringt "shift" nichts, wenn Du nachher ohnehin wieder "%*" verwendest, daher also:
Mit der Schreibweise
gibst Du die Anweisung, im aus allen Parametern bestehenden String %Rest% den Teil %1 (also den ersten Parameter) durch "Nichts" (steht zwischen "=" und "!"
) zu ersetzen, also diesen Teil weg zu lassen.
"DelayedExpansion" (mit dem Variablenbegrenzungszeichen "!") benötigst Du, da der zu ersetzende erste Parameter ebenfalls eine Variable ist (und daher "%" im Namen hat).
Grüße
bastla
Wie schon oben festgestellt, bringt "shift" nichts, wenn Du nachher ohnehin wieder "%*" verwendest, daher also:
@echo off & setlocal enabledelayedexpansion
for /f "tokens=2" %%i in ('findstr /b "units" %1') do if "%%i"=="%%X" (copy ...)
set "Rest=%*"
"C:\pfad zur.exe" !Rest:%1=!
!Rest:%1=!
"DelayedExpansion" (mit dem Variablenbegrenzungszeichen "!") benötigst Du, da der zu ersetzende erste Parameter ebenfalls eine Variable ist (und daher "%" im Namen hat).
Grüße
bastla
Hallo QuakeMarine1!
Dabei bleiben zwar die Trennzeichen (Leerzeichen) nach %1 und %2 noch am Anfang von %Rest%, aber bei Bedarf kannst Du diese auch noch mit-ersetzen:
Wenn Du ganz sicher bist, dass es zwischen %1 und %2 nur ein einziges Leerzeichen gibt, sollte auch
klappen.
Grüße
bastla
... wie parameter 1 und 2 skippen ...
Selbes Prinzip:set "Rest=%*"
set "Rest=!Rest:%1=!"
set "Rest=!Rest:%2=!"
...
set "Rest=!Rest:%1 =!"
set "ParamsAb3=!Rest:%1 %2 =!"
Grüße
bastla