nagus
Goto Top

For-Schleife und Variablen durch nummerieren

Moin,
ich stehe mal wieder auf dem Schlauch und sehe die Lösung nicht ....

so sieht grob der code aus.
Problemzone ist gerade die For-Schleife: er zeigt mir maximal die Nummern an aber nicht die vorher definierten Variablen.

setlocal enabledelayedexpansion
.
if not exist "%~dp0robocopy.exe" (set "scopy=xcopy /V /F /R /S /Y") else  (set "scopy=%~dp0robocopy.exe /e /w:2 /r:5 /TEE /LOG+:%localpfad%\robocopy.log") && set copytyp=robocopy  
.
set source1=x
set source2=y
set target1=j
set target2=k
.
.
.
for /L %%i in (1,1,4) do %scopy% %source%%%i  %target%%%i

getestet hatte ich bereits

for /L %%i in (1,1,4) do "%scopy% %%source%%%i% %%target%%%i%"  
.
for /L %%i in (1,1,4) do %scopy% %%%source%%%i%% %%%target%%%i%%
.
for /L %%i in (1,1,4) do %scopy% !%%%source%%%i%%! !%%%target%%%i%%!

Wer kann mir helfen???

Danke
Nagus

Content-ID: 230964

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

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

bastla
Lösung bastla 25.02.2014, aktualisiert am 26.02.2014 um 01:06:17 Uhr
Goto Top
Hallo Nagus!

Wie wär''s mit
for /L %%i in (1,1,2) do %scopy% !source%%i!  !target%%i!
Grüße
bastla
Biber
Lösung Biber 25.02.2014 aktualisiert um 22:26:13 Uhr
Goto Top
Moin Nagus,

ergänzend zu bastlas Lösung hier ein Syntax-Beispiel ohne DelayedExpansion:
:: TestVarInVar.cmd
@echo off & setlocal
:: ein paar "Mein"-Variablen setzen 
Set "MeineVar=MeinX"  
Set "MeinX1=MeinErsterWert"  
Set "MeinX2=MeinZweiterWert"  
Set "MeinX3=MeinDritterWert"  
:: alle "Mein"-Variablen anzeigen 
Set Mein

:: Zusammengesetzte Variable ohne DelayedExpansion benutzen
For /L %%i in ( 1 1 3) do @call echo %MeineVar% + i=%%i wird zu %%%MeineVar%%%i%%%  

Ausgabe des Schnipsels
C:\Users\Biber>d:\temp\TestVarInVar.cmd
MeineVar=MeinX
MeinX1=MeinErsterWert
MeinX2=MeinZweiterWert
MeinX3=MeinDritterWert
MeinX + i=1 wird zu MeinErsterWert
MeinX + i=2 wird zu MeinZweiterWert
MeinX + i=3 wird zu MeinDritterWert

Grüße
Biber
Nagus
Nagus 25.02.2014 aktualisiert um 22:31:27 Uhr
Goto Top
Hi bastla,
hatte ich mir am Anfang auch überlegt, habe dann aber keine Lösung gefunden wie ich vorher die Pfade definiere. Da es sich um Userprofile-Pfade handelt, habe ich die IDs schon dynamisch eingebaut ... wobei mir da jetzt auch gerade ein paar Lösungen einfallen. ;-D

Aber danke für die Idee face-smile
Nagus der nur eine Stunde in das script stecken wollte
Nagus
Nagus 25.02.2014 um 22:30:18 Uhr
Goto Top
Danke Biber, dass war es!
Noch eine Frage: ich habe auch mit setlocal enabledelayedexpansion getestet und es macht keinen Unterschied - weshalb der Hinweis im script?

Viele Grüße
Nagus
Biber
Biber 25.02.2014 um 22:46:22 Uhr
Goto Top
Moin Nagus,

du benötigst für mein Beispiel keine aktivierte "Verzögerte Variablenauflösung" aka Anweisung SetLocal EnableDelayedExpansion.
Es stört aber auch nicht, wenn du diese Anweisung in deinem Skript hast (weil du es an anderer Stelle brauchst).

Was du allerdings bei meiner Lösung benötigst sind starke Nerven oder einen extrem niedrigen Blutdruck.
Sonst wirst du bei der Eingabe des sechsten oder siebten Prozentzeichens in Folge bekloppt.

Besser lesbar ist bastlas Variante (wenn man einmal das Prinzip verstanden hat).

Grüße
Biber
bastla
Lösung bastla 25.02.2014, aktualisiert am 26.02.2014 um 01:05:57 Uhr
Goto Top
... und als Ergänzung: Keine "Verzögerte Variablenauflösung" bedeutet aber auch: Keine Probleme mit "!" in Variablenwerten ...

Grüße
bastla
Biber
Lösung Biber 25.02.2014, aktualisiert am 26.02.2014 um 01:06:00 Uhr
Goto Top
Moin bastla,

Zitat von @bastla:

... und als Ergänzung: Keine "Verzögerte Variablenauflösung" bedeutet aber auch: Keine Probleme mit
"!" in Variablenwerten ...
Somit kannst du auch diese Variable definieren:
set Meine!!NurMeine!!FingerWech!!Var=Voooorsicht!!

Lass ich mal als Benefit gelten...

Grüße
Biber
Nagus
Nagus 26.02.2014 aktualisiert um 01:05:52 Uhr
Goto Top
lol
ok - jetzt habe ich auch Bastlas Ansatz begriffen ... is irgendwie schon zu spät.
Dann habe ich ja für morgen die Qual der Wahl face-smile

Danke Euch beiden!!

Viele Grüße
Nagus der müde
Endoro
Endoro 26.02.2014 um 14:05:30 Uhr
Goto Top
Hallo Biber,

Zitat von @Biber:
Was du allerdings bei meiner Lösung benötigst sind starke Nerven oder einen extrem niedrigen Blutdruck.

Jetzt verstehe ich, warum du drei Prozent extra spendiert hast. face-smile

Gruss Endoro.
Nagus
Nagus 26.02.2014 um 19:29:02 Uhr
Goto Top
Hi Zusammen,
sowohl Lösung von Bastla als auch von Biber probiert - geht aber beides ned wenn ich es in meinem Script einbaue ... face-sad
Standalone klappt es ...

Aber kein Problem dann mache ich es jetzt eben zu Fuss, dachte ich mir ....

Jetzt scheitere ich an einem anderen Problem:

egal wie ich die Parameter für den Copy Job übergebe, scheitert er an den leer Zeichen

So sieht die ausgabe aus:
C:\Documents and Settings\1164106\Desktop\test_script>c:\tempapp\\robocopy.exe
e /w:2 /r:5 /TEE /LOG+:c:\tempapp\\robocopy.log C:\Documents and Settings\1164
6\Favorites\ c:\tempapp\\Favorites\

 Log File : c:\tempapp\robocopy.log

------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows     ::     Version XP010
------------------------------------------------------------------------------

  Started : Wed Feb 26 18:57:42 2014

   Source - C:\Documents\
     Dest - C:\Documents and Settings\1164106\Desktop\test_script\and\

    Files :
  Options : /TEE /S /E /COPY:DAT /R:5 /W:2

set "source1=C:\Documents and Settings\%username_alt%\Favorites\"  
set "source2=C:\Documents and Settings\%username_alt%\desktop\"  
set "source3=C:\Documents and Settings\%username_alt%\Application Data\Microsoft\Internet Explorer\Quick Launch\"  
set "source4=H:\"  
:: --------------------------------------------------------
set "target1=%localpfad%\Favorites\"  
set "target2=%localpfad%\Desktop\"  
set "target3=%localpfad%\Quick Launch\"  
set "target4=%localpfad%\home_lw\"  
set "return=export_ende"  
if not exist "%localpfad%\robocopy.exe" (set "scopy=xcopy /V /F /R /S /Y") else (set "scopy=%localpfad%\robocopy.exe /e /w:2 /r:5 /TEE /LOG+:%localpfad%\robocopy.log") && set copytyp=robocopy  
goto copy_job
.
.
.
for /L %%i in (1,1,4) do %scopy% !source%%i! !target%%i!
%scopy% %source1% %target1% //nur zum testen bringt aber den selben mist

ich kapiere es gerade nicht mehr
bastla
bastla 26.02.2014 aktualisiert um 19:38:46 Uhr
Goto Top
Hallo Nagus!

Leerzeichen --> Anführungszeichen
for /L %%i in (1,1,4) do %scopy% "!source%%i!" "!target%%i!"
Grüße
bastla
Nagus
Nagus 26.02.2014 um 23:26:41 Uhr
Goto Top
Hi Bastla,
danke wird morgen gleich ausprobiert!

Ich kapiere aber nicht warum auch der Aufruf
%scopy% %source1% %target1%
nicht richtig ausgeführt wird, obwohl mir echo Variable jweils den richtigen wert anzeigt ...

Bin etwas ratlos ....

Gruß
Nagus
bastla
bastla 26.02.2014 um 23:32:33 Uhr
Goto Top
Hallo Nagus!

Da in %source1% ein Pfad mit Leerzeichen steht, brauchst Du auch hier die einschließenden Anführungszeichen, da Leerzeichen in CMD eben als Trennzeichen interpretiert werden.

Grüße
bastla
Nagus
Nagus 27.02.2014 um 10:02:38 Uhr
Goto Top
Moin,

warum auch immer - es klappt nicht ....
setlocal enabledelayedexpansion 
.
.
set "localpfad=c:\tempapp\%username_alt%"  
.
.
:copy_export
:: Definition der Quell/Ziel Variablen
:: -------------------------------------------------------
echo on
set "source1=C:\Documents and Settings\%username_alt%\Favorites\"  
set "source2=C:\Documents and Settings\%username_alt%\desktop\"  
set "source3=C:\Documents and Settings\%username_alt%\Application Data\Microsoft\Internet Explorer\Quick Launch\"  
set "source4=H:\"  
:: --------------------------------------------------------
set "target1=%localpfad%\Favorites\"  
set "target2=%localpfad%\Desktop\"  
set "target3=%localpfad%\Quick Launch\"  
set "target4=%localpfad%\home_lw\"  
set "return=export_ende"  
if not exist "%localpfad%\robocopy.exe" (set "scopy=xcopy /V /F /R /S /Y") else (set "scopy=%localpfad%\robocopy.exe /e /w:2 /r:5 /TEE /LOG+:%localpfad%\robocopy.log") && set copytyp=robocopy  
goto copy_job
.
.
:: ------------------- copy_job ----------------------------------
:copy_job
for /L %%i in (1,1,4) do %scopy% "!source%%i!" "!target%%i!"  

%scopy% "%source1%" "%target1%"  

-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows :: Version XP010

Started : Thu Feb 27 09:47:17 2014

Source : C:\Documents and Settings\1164106\Favorites" c:\tempapp\1164106\Favorites"\
Dest -

Files : *.*

Options : *.* /TEE /S /E /COPY:DAT /R:5 /W:2


Vor allem verstehe ich nicht, warum robocopy die Zeile
%scopy% "%source1%" "%target1%"
als einen Wert interpretiert ....?

Okay ... einen Blank am Ende der Variablen zugefügt und es funktioniert ....

Bei der For-Schleife sehe ich aber keine Licht im Dunkel. Wobei ich hier gerne verstehen möchte warum es nicht klappt.
Endoro
Endoro 27.02.2014 aktualisiert um 12:03:11 Uhr
Goto Top
Hey,
falls im Pfad zur Logdatei Leerzeichen sind, muss der auch in Quotes gesetzt werden.
Gruss.

PS: Robocopy interpretiert den am Pfad-Ende stehenden Backslash als escaping character, also muss es so:
set "source1=C:\Documents and Settings\%username_alt%\Favorites"  
oder so:
set "source1=C:\Documents and Settings\%username_alt%\Favorites\\"  
gemacht werden.
Nagus
Nagus 27.02.2014 um 12:36:46 Uhr
Goto Top
Hi, config für robocopy hat er immer vollständig übernommen.

Nachdem ich nun jeweils die Variablen um ein leerzeichen erweitert habe funktioniert es.

Nur die For Schleife habe ich ums Verrecken nicht zum fliegen bekommen und ich glaube das ich so ziemlich alle Varianten durch probiert habe ....

Danke für Eure Hilfe!
Gruß
Nagus
Endoro
Endoro 27.02.2014 um 13:37:02 Uhr
Goto Top
Dann zeig doch mal die Ausgabe der Forschleife, während ECHO ON.
pieh-ejdsch
pieh-ejdsch 02.03.2014 aktualisiert um 16:20:46 Uhr
Goto Top
PS: Robocopy interpretiert den am Pfad-Ende stehenden Backslash als escaping character, also muss es so:

ich schließe da immer Quelle und Ziel mit einem Backslash und Punkt. Da passt alles mit den umschließenden Anführungszeichen und/oder der vorher vorhandene abschließende Backslash.
robocopy "Q:\Quellpfad\\." "Z:\Zielpfad\."  

als entsprechende Zeile dann:
for /L %%i in (1,1,4) do %scopy% "!source%%i!\." "!target%%i!\."  
so passt es auch mit xcopy

Gruß Phil