Top-Themen

Aktuelle Themen (A bis Z)

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

Variablenauflösung innerhalb verschachtelter FOR-Schleife

Frage Entwicklung Batch & Shell

Mitglied: matbuss

matbuss (Level 1) - Jetzt verbinden

22.04.2010 um 17:11 Uhr, 3503 Aufrufe, 7 Kommentare

Hallo allerseits,

ich hoffe Ihr könnt mir bei meiner folgenden Frage helfen. Ich habe schon hier im Forum gesucht, bin allerdings leider noch nicht fündig geworden. Ich finde einfach den Fehler nicht.

Hintergund ist folgender:
Alte PST-Dateien werden automatisch auf einen Server zur Ablage verschoben. Der Dateiname der PST-Dateien entspricht dabei dem Postfachnamen des Benutzers. Zu diesen PST-Dateien sollen jetzt jedoch noch weitere Informationen bereit gestellt werden. Diese Informationen sollen, aus einem mit "#" getrenntem CSV extrahiert werden, dass täglich generiert wird. Diese zusätzlichen Informationen sollen dann als separate Attributdatei mit gleichem Präfix zur PST-Datei und Suffix "txt" abgelegt werden.

Die Ermittlung der PST Dateien ansich sowie die Ermittlung der Attribute ansich funktionieren auch. Problematisch wird dies allerdings jedoch in der Kombination, dann erhalte ich immer die Fehlermeldung "File not found". Ich vermute, dass irgendwie die Variable "!pstName!" in der inneren For-Schleife nicht korrekt aufgelöst wird, allerdings komme ich dem Problem auch nach Stunden nicht auf die Spur.

Die alleinstehende For-Schleife dient zur Ermittlung des Dateinamens, des aktuellsten Reports. Der Dateiname enthält dabei am Ende das Tagesdatum (funktoniert soweit).

Bei den beiden verschachtelten For-Schleifen soll die äußere dazu Dienen, alle bereits im Verzeichnis befindlichen PST-Dateien zu durchlaufen (Skript wird 1x täglich gestartet). Dabei wird das *.pst in *._pst umbenannt, um nicht erneut aufgegriffen zu werden (funktioniert soweit auch). Dann soll für jedes gefundene PST innerhalb der inneren For-Schleife, die Reportdatei durchlaufefen werden, um die entsprechenden Attribute zu übermitteln. Gebe ich den Reportnamen fix ein, funktioniert dies auch, allerdings nicht unter Verwendung von !pstName!.

Wo habe ich hier etwas übersehen?

Vielen Dank im Voraus.

Gruß,
matbuss


01.
@ECHO OFF 
02.
SETLOCAL ENABLEDELAYEDEXPANSION 
03.
 
04.
REM ------------- GET REPORT FILE - START ----------------- 
05.
SET filepath=C:\d3\Import\hrt\PST-Transfer 
06.
SET filemask=*.csv 
07.
SET searchFilter=.csv 
08.
 
09.
FOR /F "tokens=4" %%a IN ('dir "%filepath%\%filemask%" ^| Find /i "%searchFilter%"') DO ( 
10.
   SET reportFile=%filepath%\%%a 
11.
12.
REM ------------- GET REPORT FILE - END ------------------- 
13.
 
14.
REM ----------- GET PST ATTRIBUTES - START ---------------- 
15.
SET filepath=C:\d3\Import\hrt\PST-Transfer 
16.
SET filemask=*.pst 
17.
SET searchFilter=.pst 
18.
 
19.
FOR /F "tokens=4" %%a IN ('dir "%filepath%\%filemask%" ^| Find /i "%searchFilter%"') DO ( 
20.
   SET pstName=%%a 
21.
   SET pstName=!pstName:.pst=! 
22.
   REN "%filepath%\!pstName!.pst" "!pstName!._pst" 
23.
   ECHO !pstName! 
24.
    
25.
   FOR /F "tokens=1-10 delims=#" %%b IN ('findstr /b /i /c:"!pstname!" "%reportFile%"') DO (  
26.
      SET csvPstName=%%b 
27.
      SET csvSurname=%%c 
28.
      SET csvGivenName=%%d 
29.
      SET csvCostUnit=%%e 
30.
      SET csvStreet=%%f 
31.
      SET csvPostalCode=%%g 
32.
      SET csvCity=%%h 
33.
      SET csvCompany=%%i 
34.
      SET csvDepartment=%%j 
35.
      SET csvCountry=%%k 
36.
 
37.
      REM ECHO Name: !csvPstName! 
38.
      REM ECHO Surname: !csvSurname! 
39.
      REM ECHO Given Name: !csvGivenName! 
40.
      REM ECHO Cost Unit: !csvCostUnit! 
41.
      REM ECHO Street: !csvStreet! 
42.
      REM ECHO Postal Code: !csvPostalCode! 
43.
      REM ECHO City: !csvCity! 
44.
      REM ECHO Company: !csvCompany! 
45.
      REM ECHO Department: !csvDepartment! 
46.
      REM ECHO Country: !csvCountry! 
47.
48.
49.
REM ------------ GET PST ATTRIBUTES - END ----------------- 
50.
ENDLOCAL
Mitglied: bastla
22.04.2010 um 17:41 Uhr
Hallo matbuss und willkommen im Forum!

Eigentlich würde ich das eher so versuchen:
01.
@ECHO OFF & SETLOCAL 
02.
 
03.
REM ------------- GET REPORT FILE - START ----------------- 
04.
SET "filepath=C:\d3\Import\hrt\PST-Transfer" 
05.
SET "filemask=*.csv" 
06.
SET "searchFilter=.csv" 
07.
 
08.
FOR /F "tokens=4" %%a IN ('dir "%filepath%\%filemask%" ^| Find /i "%searchFilter%"') DO ( 
09.
   SET "reportFile=%filepath%\%%a" 
10.
11.
REM ------------- GET REPORT FILE - END ------------------- 
12.
 
13.
REM ----------- GET PST ATTRIBUTES - START ---------------- 
14.
SET "filepath=C:\d3\Import\hrt\PST-Transfer" 
15.
SET "filemask=*.pst" 
16.
SET "searchFilter=.pst" 
17.
 
18.
PUSHD "%filepath%" 
19.
FOR /F "tokens=4" %%a IN ('dir "%filemask%" ^| Find /i "%searchFilter%"') DO ( 
20.
   REN "%%a" "%%~na._pst" 
21.
    
22.
   FOR /F "tokens=1-10 delims=#" %%b IN ('findstr /b /i /c:"%%~na" "%reportFile%"') DO (  
23.
      SET csvPstName=%%b 
24.
      SET csvSurname=%%c 
25.
      SET csvGivenName=%%d 
26.
      SET csvCostUnit=%%e 
27.
      SET csvStreet=%%f 
28.
      SET csvPostalCode=%%g 
29.
      SET csvCity=%%h 
30.
      SET csvCompany=%%i 
31.
      SET csvDepartment=%%j 
32.
      SET csvCountry=%%k 
33.
34.
35.
REM ------------ GET PST ATTRIBUTES - END ----------------- 
36.
POPD
Die Verwendung des "searchFilters" ergibt in der derzeitigen Form keinen Sinn (eine Zeile
FOR %%a IN ("%filepath%\%filemask%") DO SET "reportFile=%%a"
oder
FOR /F "delims=" %%a IN ('DIR /b "%filemask%"') DO (
sollte schon genügen) ...

... und solange ich nicht weiß, was Du mit den Attributen noch alles anstellen willst, würde ich auch die Variablen dafür einsparen und einfach "%%b" bis "%%k" verwenden.


Grüße
bastla
Bitte warten ..
Mitglied: Biber
22.04.2010 um 17:58 Uhr
Moin matbuss,

willkommen im Forum.

Ich vermute den Fehler in den Zeilen 19-23, die sogar für mich etwas verworren aussehen... und ich habe einiges Wirres zusammengeschrotet.

Also:
01.
.... 
02.
REM FOR /F "tokens=4" %%a IN ('dir "%filepath%\%filemask%" ^| Find /i "%searchFilter%"') DO (  
03.
REM    SET pstName=%%a  
04.
REM    SET pstName=!pstName:.pst=!  
05.
REM   REN "%filepath%\!pstName!.pst" "!pstName!._pst"  
06.
REM   ECHO !pstName!  
07.
:: -----------wenn überhaupt, dann vielleicht: 
08.
FOR /F "tokens=4" %%a IN ('dir "%filepath%\%filemask%" ^| Find /i "%searchFilter%"') DO (  
09.
 
10.
   REN "%filepath%\!pstName!.pst" "%%~na._pst"  
11.
   ECHO Name ohne Endung %%~na  
12.
   .... 
13.
 
Aber:
Die Datei, die (manchmal) nicht gefunden wird
--> liegt daran, dass du eine Dateiliste durchläufst (FOR-Anweisung in Zeile 19), die du aber innerhalb der For-Anweisung änderst.

Ist vergleichbar einer Schleife, die du von einem Zähler x=1 bis x=100 laufen lässt und im Anweisungsteil dann mal sagst: x = 21

Das Ergebnis ist nicht so genau prognostizierbar.

Du brauchst die Umbenamserei ja nicht wissenschaftlich aufarbeiten, aber sinnvoll wären nur zwei Strategien IMHO:
  • entweder eine SORTIERTE Liste erzeugen mit einem DIR-Befehl o.ä. - meinetwegen nach Datum oder nach Größe. Dann kannst du die Elemente (Dateien) DIESER Liste nach Herzenslust mit anderen Datei-NAMEN oder ENDUNGEN ausgestalten.
  • oder du schreibt die komplette Liste der abzuarbeitenden Dateien in eine Temp-Datei... dann kannst du eine Zeile nach der anderen lesen und die Dateien umbenamsen.

Grüße
Biber

[Edit] ...okay, okay, bastla... der Kaffee hat mir nichts genützt.... ich hol mir mal was Stärkeres... [/Edit]
Bitte warten ..
Mitglied: bastla
22.04.2010 um 19:02 Uhr
@Biber
entweder eine SORTIERTE Liste erzeugen mit einem DIR-Befehl o.ä. - meinetwegen nach Datum oder nach Größe.
Sollte nicht bereits ein simples "dir /b" genügen, um bereits vorweg eine komplette (und innerhalb der Schleife nicht mehr upgedatete) Dateiliste zu erhalten?

Grüße
bastla

P.S.: Du hättest Dich vielleicht doch für die "lila" Pause entscheiden sollen ...
Bitte warten ..
Mitglied: matbuss
22.04.2010 um 19:43 Uhr
Hallo,

danke für die super schnelle Rückmeldung. Ich werde das direkt morgen früh ausprobieren

Gruß,
matbuss
Bitte warten ..
Mitglied: Biber
22.04.2010 um 22:13 Uhr
[OT] @bastla
Zitat von bastla:
@Biber
> entweder eine SORTIERTE Liste erzeugen mit einem DIR-Befehl o.ä. - meinetwegen nach Datum oder nach Größe.
Sollte nicht bereits ein simples "dir /b" genügen, um bereits vorweg eine komplette (und innerhalb der Schleife
nicht mehr upgedatete) Dateiliste zu erhalten?

Kann ich beantworten, ob die Liste "nicht mehr upgedated" wird
(=22:06:08  D:\temp\dideli=) 
>copy ..\test*.txt 
..\test mit space.txt 
..\test.txt 
..\test37.txt 
..\test777.txt 
..\test97.txt 
..\test98.txt 
..\test99.txt 
..\testfiel.txt 
..\testout.txt 
..\testrar.txt 
..\testset.txt 
..\testutf.txt 
       12 Datei(en) kopiert. 
 
(=22:08:40  D:\temp\dideli=) 
>for /f "delims=" %i in ('dir /b *.txt') do @echo if exist *.txt @del *.txt /q && @echo %i done 
if exist *.txt @del *.txt /q 
test mit space.txt done 
if exist *.txt @del *.txt /q 
test.txt done 
if exist *.txt @del *.txt /q 
test37.txt done 
if exist *.txt @del *.txt /q 
test777.txt done 
if exist *.txt @del *.txt /q 
test97.txt done 
if exist *.txt @del *.txt /q 
test98.txt done 
if exist *.txt @del *.txt /q 
test99.txt done 
if exist *.txt @del *.txt /q 
testfiel.txt done 
if exist *.txt @del *.txt /q 
testout.txt done 
if exist *.txt @del *.txt /q 
testrar.txt done 
if exist *.txt @del *.txt /q 
testset.txt done 
if exist *.txt @del *.txt /q 
testutf.txt done 
 
(=22:09:04  D:\temp\dideli=) 
>for /f "delims=" %i in ('dir /b *.txt') do @if exist *.txt @del *.txt /q && @echo %i done 
test mit space.txt done 
 
(=22:09:50  D:\temp\dideli=) 
>
--> der "scharf gemachte" Durchlauf unten ohne "echo" läuft EINmal.

Grüße
Biber

[/OT]
Bitte warten ..
Mitglied: bastla
22.04.2010 um 22:36 Uhr
[OT2]
@Biber
Leider auch mit Sortierung:
D:\Texte>for /f "delims=" %i in ('dir /b /od *.txt') do @echo if exist *.txt @del *.txt /q && @echo %i done 
if exist *.txt @del *.txt /q 
Binary-1.txt done 
if exist *.txt @del *.txt /q 
Binary-2.txt done 
if exist *.txt @del *.txt /q 
Binary-3.txt done 
if exist *.txt @del *.txt /q 
Binary-4.txt done 
if exist *.txt @del *.txt /q 
Bin.txt done 
if exist *.txt @del *.txt /q 
Beispiel_2.txt done 
if exist *.txt @del *.txt /q 
Beispiel_3.txt done 
if exist *.txt @del *.txt /q 
Beispiel.txt done 
if exist *.txt @del *.txt /q 
Beispiel_4.txt done 
 
D:\Texte>for /f "delims=" %i in ('dir /b /od *.txt') do @if exist *.txt @del *.txt /q && @echo %i done 
Binary-1.txt done
Aber:
D:\Texte>dir /b *.txt 
Binary-1.txt 
Binary-2.txt 
Binary-3.txt 
Binary-4.txt 
Bin.txt 
Beispiel_2.txt 
Beispiel_3.txt 
Beispiel.txt 
Beispiel_4.txt 
 
D:\Texte>for /f "delims=" %i in ('dir /b *.txt') do copy %i "%~ni_neu%~xi">nul && @echo %i done 
 
D:\Texte>copy Binary-1.txt "Binary-1_neu.txt"  1>nul  && 
Binary-1.txt done 
 
D:\Texte>copy Binary-2.txt "Binary-2_neu.txt"  1>nul  && 
Binary-2.txt done 
 
D:\Texte>copy Binary-3.txt "Binary-3_neu.txt"  1>nul  && 
Binary-3.txt done 
 
D:\Texte>copy Binary-4.txt "Binary-4_neu.txt"  1>nul  && 
Binary-4.txt done 
 
D:\Texte>copy Bin.txt "Bin_neu.txt"  1>nul  && 
Bin.txt done 
 
D:\Texte>copy Beispiel_2.txt "Beispiel_2_neu.txt"  1>nul  && 
Beispiel_2.txt done 
 
D:\Texte>copy Beispiel_3.txt "Beispiel_3_neu.txt"  1>nul  && 
Beispiel_3.txt done 
 
D:\Texte>copy Beispiel.txt "Beispiel_neu.txt"  1>nul  && 
Beispiel.txt done 
 
D:\Texte>copy Beispiel_4.txt "Beispiel_4_neu.txt"  1>nul  && 
Beispiel_4.txt done 
 
D:\Texte>dir /b *.txt 
Binary-1_neu.txt 
Binary-2_neu.txt 
Binary-3_neu.txt 
Binary-4_neu.txt 
Bin_neu.txt 
Beispiel_2_neu.txt 
Beispiel_3_neu.txt 
Beispiel_neu.txt 
Beispiel_4_neu.txt 
Binary-1.txt 
Binary-2.txt 
Binary-3.txt 
Binary-4.txt 
Bin.txt 
Beispiel_2.txt 
Beispiel_3.txt 
Beispiel.txt 
Beispiel_4.txt
Grüße
bastla

[/OT2]
Bitte warten ..
Mitglied: matbuss
23.04.2010 um 11:09 Uhr
Hallo,

besten Dank für die Hilfe. Habe eure Anmerkungen da mit eingearbeitet und auch die Variablen weg geschmissen. Funktioniert jetzt einwandfrei .

Gruß,
matbuss
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Verschachtelte FOR-Schleife mit einem Argument
gelöst Frage von mp-homeBatch & Shell3 Kommentare

Hallo Forum, ich versuche mehrere FOR-Schleifen in eine verschachtelte FOR-Schleife zu ändern. Leider scheine ich zu doof für dieses ...

Batch & Shell
Verschachtelte For Schleife für Batch Neuling
Frage von yperiuBatch & Shell3 Kommentare

Hallo liebe Profis, ich habe eine sehr umfangreiche Benchmark-Schleife zum Laufen zu bringen, die ich ohne For 72 mal ...

Batch & Shell
In einer verschachtelten For-Schleife Ping info auslesen
gelöst Frage von Tommy-TyrolBatch & Shell4 Kommentare

Hallo allerseits, quäle mich seit einiger Zeit mit folgendem Problem. In einer Textdatei (ipfil.txt) stehen IP-Adressen von rechnern welche ...

Batch & Shell
Batchfile MSDOS - Berechnung in verschachtelter FOR-Schleife
gelöst Frage von KlimatorBatch & Shell3 Kommentare

Hallo zusammen, ich möchte in einer dreifach verschachtelten FOR-Schleife eine Berechnung auf Grundlage der drei hochgezählten Variablen vornehmen, doch ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 45 MinutenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 1 StundeMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 8 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Heiß diskutierte Inhalte
Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux13 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Windows 10
Alle Programme mit bestimmtem Namen automatisch (per GPO) deinstallieren
gelöst Frage von lordofremixesWindows 1012 Kommentare

Hallo zusammen, gibt es eine Möglichkeit, alle Programme beginnend mit z.B. "Dell" im Namen per Script und somit per ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...