quakemarine1
Goto Top

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

Content-Key: 89799

Url: https://administrator.de/contentid/89799

Printed on: April 19, 2024 at 07:04 o'clock

Mitglied: 60730
60730 Jun 13, 2008 at 15:08:37 (UTC)
Goto Top
moin,

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???
Member: bastla
bastla Jun 13, 2008 at 15:15:11 (UTC)
Goto Top
Hallo QuakeMarine1!

Könnte so gehen:
@echo off
cls
echo Ab Parameter 2:
for /f "tokens=1*" %%i in ("%*") do echo %%j  
echo\
echo Parameter 10:
for /f "tokens=10" %%i in ("%*") do echo %%i  
Grüße
bastla
Member: Biber
Biber Jun 13, 2008 at 15:54:39 (UTC)
Goto Top
Moin quakeMarine1,

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
Demo:
>>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]
... 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
Member: QuakeMarine1
QuakeMarine1 Jun 13, 2008 at 16:17:45 (UTC)
Goto Top
oh gott
will doch nur ein parameter kürzen - was für horror scripte
face-sad face-sad face-sad

könnte man die parameter als block angeben? so in der art

batch.bat alpha "beta gamma delta"

und nach dem shiften
echo %1 ohne "" ausgeben ?
Mitglied: 60730
60730 Jun 13, 2008 at 16:46:31 (UTC)
Goto Top
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.
Member: QuakeMarine1
QuakeMarine1 Jun 13, 2008 at 17:01:26 (UTC)
Goto Top
was genau ich machen will - oje ....

appl. A gibt befehle an batch B weiter
appl.A hat eigene variablen die mit $(irgendwas) definiert sind

A übergibt an B
$(Scene.Path.Dequote) -nogui -render -$(Scene.Enquote) -frame ($subrange.start) $(subrange.end) [$(sequenceby)] -threads $(cpus) $(extra)


batch B
xcopy ....bla bla
for /L %%X in (0,1,10) do for /f "tokens=2" %%i in ('findstr /b "units" "%1\info.txt"') do if "%%i"=="%%X" (copy /y "C:\cinema\c4d9.6 FR32\prefs\%%X.p" "C:\cinema\c4d9.6 FR32\prefs\CINEMA 4D.prf" && echo units set to %%X) else echo units set to
"C:\cinema\c4d9.6 FR32\CINEMA 4D.exe" %*

am ende bei %* darf nicht $(Scene.Path.Dequote) übergeben werden
daher wollte ich die per shift übergehen

rafft das einer ausser mir ?
Member: Biber
Biber Jun 13, 2008 at 17:07:34 (UTC)
Goto Top
Moin Quakemarine1,

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
...ergibt.
>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...
Member: QuakeMarine1
QuakeMarine1 Jun 13, 2008 at 17:22:37 (UTC)
Goto Top
so weit so gut und wie weiter ?
batch scripen war nie meine stärke
Member: bastla
bastla Jun 13, 2008 at 17:41:51 (UTC)
Goto Top
@Biber

... obwohl: Bei Verwendung von Anführungszeichen für die Parameter 2 bis x könnte die "NochnShifttest.cmd" eigentlich auch so aussehen: face-wink
@echo off & setlocal
echo Parm_1: [%~1]
echo Parm_2: [%~2]
@QuakeMarine1
Kannst Du denn Anwendung A dazu überreden, alles nach dem ersten Parameter in Anführungszeichen einzuschließen?

Grüße
bastla
Member: QuakeMarine1
QuakeMarine1 Jun 22, 2008 at 15:54:27 (UTC)
Goto Top
hallo
ich muss die sache noch mal aufwärmen

es ist mir nicht vergönnt das problem zu lösen sobald ein leerzeichen im ersten parameter steckt und ein " erzwingt

mal vereinfacht dargestellt
was appA an batch übergibt ist

"$(Scene.path.dequote)\info.txt" -nogui -render ...
was übersetzt ist
"Z:\test test\info.txt" -nogui -render ...

das batch

for /f "tokens=2" %%i in ('findstr /b "units" %1') do if "%%i"=="%%X" (copy ...)

das lubbt 1a
dann aber

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

ok ich könnte leerzeichen im parameter vermeiden nur bin ich nicht sicher das sich das immer vermeiden lässt

schwere geburt...

A.
Member: Biber
Biber Jun 22, 2008 at 16:06:51 (UTC)
Goto Top
Moin QuakeMarine1,

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?

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
Member: QuakeMarine1
QuakeMarine1 Jun 22, 2008 at 17:08:02 (UTC)
Goto Top
tokens=2 nur wenn leerzeichen in dem parameter ist sonst tokens=1
Member: bastla
bastla Jun 22, 2008 at 18:42:11 (UTC)
Goto Top
Hallo QuakeMarine1!

Wenn in den Parametern kein "!" vorkommt, vielleicht so:
@echo off & setlocal enabledelayedexpansion
set "Alle=%*"  
echo "C:\pfad zur.exe" !Alle:%1=!  

Grüße
bastla
Member: QuakeMarine1
QuakeMarine1 Jun 22, 2008 at 18:54:50 (UTC)
Goto Top
ich habe gerade die Appl. nicht zu hand weil anderer PC
so etwa?

@echo off & setlocal enabledelayedexpansion
for /f "tokens=2" %%i in ('findstr /b "units" %1') do if "%%i"=="%%X" (copy ...)
shift /1
set "Rest=%*"
"C:\pfad zur.exe" !Rest:%1=!

wobei der set nicht gehen sollte - eher irgendwie so

for /f "tokens=2" %%i in ('findstr /b "units" %1') do if "%%i"=="%%X" (copy ...)
for /f "tokens=1*" %%i in ("%*") do set "Rest=%*"
"C:\pfad zur.exe" !Rest:%1=!


oder net ??
Member: bastla
bastla Jun 22, 2008 at 19:22:15 (UTC)
Goto Top
Hallo QuakeMarine1!

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=!  
Mit der Schreibweise
!Rest:%1=!
gibst Du die Anweisung, im aus allen Parametern bestehenden String %Rest% den Teil %1 (also den ersten Parameter) durch "Nichts" (steht zwischen "=" und "!" face-wink) 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
Member: QuakeMarine1
QuakeMarine1 Jun 24, 2008 at 15:43:46 (UTC)
Goto Top
das ist ja genials - wenn wir jetzt noch europameister werden ...


letztlich die frage wie parameter 1 und 2 skippen kann (für den fall der fälle)


dickes danke
Member: bastla
bastla Jun 24, 2008 at 15:53:48 (UTC)
Goto Top
Hallo QuakeMarine1!

... wie parameter 1 und 2 skippen ...
Selbes Prinzip:
set "Rest=%*"  
set "Rest=!Rest:%1=!"  
set "Rest=!Rest:%2=!"  
...
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:
set "Rest=!Rest:%1 =!"  
Wenn Du ganz sicher bist, dass es zwischen %1 und %2 nur ein einziges Leerzeichen gibt, sollte auch
set "ParamsAb3=!Rest:%1 %2 =!"  
klappen.

Grüße
bastla