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

Aus einer FOR-Schleife die Variable benutzen anpassen und weiterverwenden...

Frage Entwicklung Batch & Shell

Mitglied: chlages

chlages (Level 1) - Jetzt verbinden

19.03.2008, aktualisiert 20.03.2008, 3268 Aufrufe, 6 Kommentare

Hallo zusammen,

ich bastel jetzt schon mehrere Stunden an dem Problem herum und komme nicht weiter. Ich hoffe ihr könnt mir helfen:

Ich möchte den Zählerwert der FOR-Schleife auslesen und als neuen Dateinamen verweden. Der Rückgabewert aus der Verzeichnis-Datei lautet "911023". Ich benötige aber für den zukünftigen Dateinamen nur die "102" aus der obigen Nummer.

Ich hoffe ihr könnt mir helfen...


REM * Variablen werden gesetzt *
REM
set DAT_ART=???.art_20080315*
set DAT_TRE=???.tre_20080315*
set DATEI=Verzeichnisse.txt
set QUELLE=U:\Filialen
set ZIEL=D:\TEST


REM * Kopiervorgang *
REM *
for /F "delims=" %%I in (%DATEI%) do (
set KURZ=%%I
type %QUELLE%\%%I\Backup\%DAT_ART% > %ZIEL%\%%I\im_export\%KURZ%.art
type %QUELLE%\%%I\Backup\%DAT_TRE% > %ZIEL%\%%I\im_export\%KURZ%.tre
)
Mitglied: bastla
19.03.2008 um 22:43 Uhr
Hallo chlages und willkommen im Forum!

Das Schlüsselwort für das Problem / die Lösung lautet "delayedexpansion". Die geänderte Batchdatei sähe damit (ungetestet) so aus:
01.
@echo off & setlocal enabledelayedexpansion 
02.
REM * Variablen werden gesetzt * 
03.
REM 
04.
set DAT_ART=???.art_20080315* 
05.
set DAT_TRE=???.tre_20080315* 
06.
set DATEI=Verzeichnisse.txt 
07.
set QUELLE=U:\Filialen 
08.
set ZIEL=D:\TEST 
09.
 
10.
 
11.
REM * Kopiervorgang * 
12.
REM * 
13.
for /F "delims=" %%I in (%DATEI%) do ( 
14.
    set "KURZ=%%I" 
15.
    type %QUELLE%\%%I\Backup\%DAT_ART% > %ZIEL%\%%I\im_export\!KURZ:~2,3!.art 
16.
    type %QUELLE%\%%I\Backup\%DAT_TRE% > %ZIEL%\%%I\im_export\!KURZ:~2,3!.tre 
17.
)
Damit die Variable KURZ innerhalb der Schleife ausgewertet werden kann, muss "delayedexpansion" eingeschaltet ("enable"d) und die Variablenschreibweise von %KURZ% auf !KURZ! abgeändert werden. Da nur die 3 Stellen nach Position 2 benötigt werden, muss der entsprechende Teilstring gebildet werden (siehe dazu auch "set /?").

Eine Alternative wäre die Verwendung eines Unterprogrammes:
01.
@echo off & setlocal 
02.
REM * Variablen werden gesetzt * 
03.
REM 
04.
set DAT_ART=???.art_20080315* 
05.
set DAT_TRE=???.tre_20080315* 
06.
set DATEI=Verzeichnisse.txt 
07.
set QUELLE=U:\Filialen 
08.
set ZIEL=D:\TEST 
09.
 
10.
 
11.
REM * Kopiervorgang * 
12.
REM * 
13.
for /F "delims=" %%I in (%DATEI%) do call :ProcessFile "%%I" 
14.
goto :eof 
15.
 
16.
:ProcessFile 
17.
set "KURZ=%~1" 
18.
type %QUELLE%\%~1\Backup\%DAT_ART% > %ZIEL%\%~1\im_export\%KURZ:~2,3%.art 
19.
type %QUELLE%\%~1\Backup\%DAT_TRE% > %ZIEL%\%~1\im_export\%KURZ:~2,3%.tre 
20.
goto :eof
Grüße
bastla

[Edit] Biber-Bug vorweggenommen und dann auch noch als Zweiter korrigiert ("%%I" in den beiden "type"-Zeilen der zweiten Variante durch "%~1" ersetzt) [/Edit]
Bitte warten ..
Mitglied: Biber
19.03.2008 um 22:46 Uhr
Moin chlages,

willkommen im Forum.

Eine Möglichkeit zur Lösung wäre das Aktivieren der "verzögerten Variablenauflösung", einer Option, die Dir ermöglicht, eine Variable innerhalb einer CMD-Anweisung zu setzen und zu verwenden.

01.
 @echo off & setlocal enableDelayedExpansion 
02.
REM * Variablen werden gesetzt * 
03.
REM 
04.
set DAT_ART=???.art_20080315* 
05.
set DAT_TRE=???.tre_20080315* 
06.
set DATEI=Verzeichnisse.txt 
07.
set QUELLE=U:\Filialen 
08.
set ZIEL=D:\TEST 
09.
 
10.
 
11.
REM * Kopiervorgang * 
12.
REM * 
13.
for /F "delims=" %%I in (%DATEI%) do ( 
14.
set LangVar=%%I 
15.
set KURZ=!LangVar:~2,3! 
16.
type %QUELLE%\%%I\Backup\%DAT_ART% > %ZIEL%\%%I\im_export\!KURZ!.art 
17.
type %QUELLE%\%%I\Backup\%DAT_TRE% > %ZIEL%\%%I\im_export\!KURZ!.tre 
18.
)
Andere Variante ohne DelayedExpansion mit Call:Sub wäre so:
01.
@echo off & setlocal 
02.
REM * Variablen werden gesetzt * 
03.
REM 
04.
set DAT_ART=???.art_20080315* 
05.
set DAT_TRE=???.tre_20080315* 
06.
set DATEI=Verzeichnisse.txt 
07.
set QUELLE=U:\Filialen 
08.
set ZIEL=D:\TEST 
09.
 
10.
 
11.
REM * Kopiervorgang * 
12.
REM * 
13.
for /F "delims=" %%I in (%DATEI%) do set "LangVar=%%I" & call:ForEachLine %%I 
14.
goto :eof 
15.
 
16.
:ForEachLine Als Parameter1 wird die Laufvariable %%I übergeben 
17.
set KURZ=%LangVar:~2,3% 
18.
type %QUELLE%\%1\Backup\%DAT_ART% > %ZIEL%\%1\im_export\%KURZ%.art 
19.
type %QUELLE%\%1\Backup\%DAT_TRE% > %ZIEL%\%1\im_export\%KURZ%.tre 
20.
goto :eof
[beides ungetestet]

Grüße
Biber
[Edit]@bastla: Nächstes Mal schreibt jeder von uns eine der beiden Varianten...*gg [/Edit]
[Edit2] Übergabe von %%I an Call:Block ergänzt. Vor bastla. Der hat den gleichen Bug... [/Edit2]
Bitte warten ..
Mitglied: bastla
19.03.2008 um 22:53 Uhr
@Biber

Bis wir das ausgeknobelt haben, sind wir mit beiden Varianten auch schon fertig ...

Grüße
bastla
Bitte warten ..
Mitglied: chlages
20.03.2008 um 09:29 Uhr
Vielen Dank für die schnelle Hilfe !

Habe jetzt die beiden Varianten, ohne die Sprünge aus der Schleife, ausprobiert und habe immer noch das Problem mit der "KURZ" Variable. Irgendwie ist bleibt mein System davon unbeeindruckt.

Wenn ich mir den Wert per "Echo" ausgebe wird er wie gewünscht angezeigt. Aber nachher im "Type" Befehl wird nur die Bezeichnung und nicht der Wert angezeigt.

Christian
Bitte warten ..
Mitglied: chlages
20.03.2008 um 13:52 Uhr
Hallo nochmal,

habe jetzt das Problem gefunden

Ich habe die Endung ".bat" für mein Skript benutzt. Nachdem ich die Endung in ".CMD" geändert habe läüft es jetzt vom feinsten....

Trotzdem vielen Dank für Eure schnelle Hilfe.

Christian
Bitte warten ..
Mitglied: miniversum
20.03.2008 um 16:44 Uhr
Ich habe die Endung ".bat" für mein Skript benutzt. Nachdem ich die Endung in ".CMD" geändert habe läüft es jetzt vom feinsten....

Was??? *Kopfkratz*
Und ich dachte immer das wäre egal?
Wird ja beides vom CMD verarbeitet.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl 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
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...