batch shift cmd

quakemarine1
Goto Top

%* 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

Ausgedruckt am: 28.06.2022 um 04:06 Uhr

Mitglied: 60730
60730 13.06.2008 um 17:08:37 Uhr
Goto Top
moin,

das, was ich aus deinem schnell erklärten Problem herausgelesen habe ist


... aber das meintest du nicht - oder doch???
Mitglied: bastla
bastla 13.06.2008 um 17:15:11 Uhr
Goto Top
Hallo QuakeMarine1!

Könnte so gehen:
Grüße
bastla
Mitglied: Biber
Biber 13.06.2008 um 17:54:39 Uhr
Goto Top
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
Mitglied: QuakeMarine1
QuakeMarine1 13.06.2008 um 18:17:45 Uhr
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 13.06.2008 um 18:46:31 Uhr
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.
Mitglied: QuakeMarine1
QuakeMarine1 13.06.2008 um 19:01:26 Uhr
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 ?
Mitglied: Biber
Biber 13.06.2008 um 19:07:34 Uhr
Goto Top
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...
Mitglied: QuakeMarine1
QuakeMarine1 13.06.2008 um 19:22:37 Uhr
Goto Top
so weit so gut und wie weiter ?
batch scripen war nie meine stärke
Mitglied: bastla
bastla 13.06.2008 um 19:41:51 Uhr
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
@QuakeMarine1
Kannst Du denn Anwendung A dazu überreden, alles nach dem ersten Parameter in Anführungszeichen einzuschließen?

Grüße
bastla
Mitglied: QuakeMarine1
QuakeMarine1 22.06.2008 um 17:54:27 Uhr
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.
Mitglied: Biber
Biber 22.06.2008 um 18:06:51 Uhr
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
Mitglied: QuakeMarine1
QuakeMarine1 22.06.2008 um 19:08:02 Uhr
Goto Top
tokens=2 nur wenn leerzeichen in dem parameter ist sonst tokens=1
Mitglied: bastla
bastla 22.06.2008 um 20:42:11 Uhr
Goto Top
Hallo QuakeMarine1!

Wenn in den Parametern kein "!" vorkommt, vielleicht so:

Grüße
bastla
Mitglied: QuakeMarine1
QuakeMarine1 22.06.2008 um 20:54:50 Uhr
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 ??
Mitglied: bastla
bastla 22.06.2008 um 21:22:15 Uhr
Goto Top
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 "!" ;-) 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
Mitglied: QuakeMarine1
QuakeMarine1 24.06.2008 um 17:43:46 Uhr
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
Mitglied: bastla
bastla 24.06.2008 um 17:53:48 Uhr
Goto Top
Hallo QuakeMarine1!

... wie parameter 1 und 2 skippen ...
Selbes Prinzip:
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