Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

For-Schleife und Variablen durch nummerieren

Frage Entwicklung Batch & Shell

Mitglied: Nagus

Nagus (Level 2) - Jetzt verbinden

25.02.2014, aktualisiert 22:26 Uhr, 2346 Aufrufe, 18 Kommentare

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.

01.
setlocal enabledelayedexpansion 
02.
03.
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 
04.
05.
set source1=x 
06.
set source2=y 
07.
set target1=j 
08.
set target2=k 
09.
10.
11.
12.
for /L %%i in (1,1,4) do %scopy% %source%%%i  %target%%%i
getestet hatte ich bereits

01.
for /L %%i in (1,1,4) do "%scopy% %%source%%%i% %%target%%%i%" 
02.
03.
for /L %%i in (1,1,4) do %scopy% %%%source%%%i%% %%%target%%%i%% 
04.
05.
for /L %%i in (1,1,4) do %scopy% !%%%source%%%i%%! !%%%target%%%i%%!
Wer kann mir helfen???

Danke
Nagus

Mitglied: bastla
LÖSUNG 25.02.2014, aktualisiert 26.02.2014
Hallo Nagus!

Wie wär''s mit
for /L %%i in (1,1,2) do %scopy% !source%%i!  !target%%i!
Grüße
bastla
Bitte warten ..
Mitglied: Biber
LÖSUNG 25.02.2014, aktualisiert um 22:26 Uhr
Moin Nagus,

ergänzend zu bastlas Lösung hier ein Syntax-Beispiel ohne DelayedExpansion:
01.
:: TestVarInVar.cmd 
02.
@echo off & setlocal 
03.
:: ein paar "Mein"-Variablen setzen 
04.
Set "MeineVar=MeinX" 
05.
Set "MeinX1=MeinErsterWert" 
06.
Set "MeinX2=MeinZweiterWert" 
07.
Set "MeinX3=MeinDritterWert" 
08.
:: alle "Mein"-Variablen anzeigen 
09.
Set Mein 
10.
 
11.
:: Zusammengesetzte Variable ohne DelayedExpansion benutzen 
12.
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
Bitte warten ..
Mitglied: Nagus
25.02.2014, aktualisiert um 22:31 Uhr
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
Nagus der nur eine Stunde in das script stecken wollte
Bitte warten ..
Mitglied: Nagus
25.02.2014 um 22:30 Uhr
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
Bitte warten ..
Mitglied: Biber
25.02.2014 um 22:46 Uhr
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
Bitte warten ..
Mitglied: bastla
LÖSUNG 25.02.2014, aktualisiert 26.02.2014
... und als Ergänzung: Keine "Verzögerte Variablenauflösung" bedeutet aber auch: Keine Probleme mit "!" in Variablenwerten ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
LÖSUNG 25.02.2014, aktualisiert 26.02.2014
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
Bitte warten ..
Mitglied: Nagus
26.02.2014, aktualisiert um 01:05 Uhr
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

Danke Euch beiden!!

Viele Grüße
Nagus der müde
Bitte warten ..
Mitglied: Endoro
26.02.2014 um 14:05 Uhr
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.

Gruss Endoro.
Bitte warten ..
Mitglied: Nagus
26.02.2014 um 19:29 Uhr
Hi Zusammen,
sowohl Lösung von Bastla als auch von Biber probiert - geht aber beides ned wenn ich es in meinem Script einbaue ...
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:
01.
C:\Documents and Settings\1164106\Desktop\test_script>c:\tempapp\\robocopy.exe 
02.
e /w:2 /r:5 /TEE /LOG+:c:\tempapp\\robocopy.log C:\Documents and Settings\1164 
03.
6\Favorites\ c:\tempapp\\Favorites\ 
04.
 
05.
 Log File : c:\tempapp\robocopy.log 
06.
 
07.
------------------------------------------------------------------------------ 
08.
   ROBOCOPY     ::     Robust File Copy for Windows     ::     Version XP010 
09.
------------------------------------------------------------------------------ 
10.
 
11.
  Started : Wed Feb 26 18:57:42 2014 
12.
 
13.
   Source - C:\Documents\ 
14.
     Dest - C:\Documents and Settings\1164106\Desktop\test_script\and\ 
15.
 
16.
    Files : 
17.
  Options : /TEE /S /E /COPY:DAT /R:5 /W:2 
18.
 
01.
set "source1=C:\Documents and Settings\%username_alt%\Favorites\" 
02.
set "source2=C:\Documents and Settings\%username_alt%\desktop\" 
03.
set "source3=C:\Documents and Settings\%username_alt%\Application Data\Microsoft\Internet Explorer\Quick Launch\" 
04.
set "source4=H:\" 
05.
:: -------------------------------------------------------- 
06.
set "target1=%localpfad%\Favorites\" 
07.
set "target2=%localpfad%\Desktop\" 
08.
set "target3=%localpfad%\Quick Launch\" 
09.
set "target4=%localpfad%\home_lw\" 
10.
set "return=export_ende" 
11.
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 
12.
goto copy_job 
13.
14.
15.
16.
for /L %%i in (1,1,4) do %scopy% !source%%i! !target%%i! 
17.
%scopy% %source1% %target1% //nur zum testen bringt aber den selben mist
ich kapiere es gerade nicht mehr
Bitte warten ..
Mitglied: bastla
26.02.2014, aktualisiert um 19:38 Uhr
Hallo Nagus!

Leerzeichen --> Anführungszeichen
for /L %%i in (1,1,4) do %scopy% "!source%%i!" "!target%%i!"
Grüße
bastla
Bitte warten ..
Mitglied: Nagus
26.02.2014 um 23:26 Uhr
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
Bitte warten ..
Mitglied: bastla
26.02.2014 um 23:32 Uhr
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
Bitte warten ..
Mitglied: Nagus
27.02.2014 um 10:02 Uhr
Moin,

warum auch immer - es klappt nicht ....
01.
setlocal enabledelayedexpansion  
02.
03.
04.
set "localpfad=c:\tempapp\%username_alt%" 
05.
06.
07.
:copy_export 
08.
:: Definition der Quell/Ziel Variablen 
09.
:: ------------------------------------------------------- 
10.
echo on 
11.
set "source1=C:\Documents and Settings\%username_alt%\Favorites\" 
12.
set "source2=C:\Documents and Settings\%username_alt%\desktop\" 
13.
set "source3=C:\Documents and Settings\%username_alt%\Application Data\Microsoft\Internet Explorer\Quick Launch\" 
14.
set "source4=H:\" 
15.
:: -------------------------------------------------------- 
16.
set "target1=%localpfad%\Favorites\" 
17.
set "target2=%localpfad%\Desktop\" 
18.
set "target3=%localpfad%\Quick Launch\" 
19.
set "target4=%localpfad%\home_lw\" 
20.
set "return=export_ende" 
21.
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 
22.
goto copy_job 
23.
24.
25.
:: ------------------- copy_job ---------------------------------- 
26.
:copy_job 
27.
for /L %%i in (1,1,4) do %scopy% "!source%%i!" "!target%%i!" 
28.
 
29.
%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.
Bitte warten ..
Mitglied: Endoro
27.02.2014, aktualisiert um 12:03 Uhr
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:
01.
set "source1=C:\Documents and Settings\%username_alt%\Favorites"
oder so:
01.
set "source1=C:\Documents and Settings\%username_alt%\Favorites\\"
gemacht werden.
Bitte warten ..
Mitglied: Nagus
27.02.2014 um 12:36 Uhr
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
Bitte warten ..
Mitglied: Endoro
27.02.2014 um 13:37 Uhr
Dann zeig doch mal die Ausgabe der Forschleife, während ECHO ON.
Bitte warten ..
Mitglied: pieh-ejdsch
02.03.2014, aktualisiert um 16:20 Uhr
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.
01.
robocopy "Q:\Quellpfad\\." "Z:\Zielpfad\."
als entsprechende Zeile dann:
01.
for /L %%i in (1,1,4) do %scopy% "!source%%i!\." "!target%%i!\."
so passt es auch mit xcopy

Gruß Phil
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst FOR Loop Variablen ( Batch ) (2)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...