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

Mitglied: matbuss

matbuss (Level 1) - Jetzt verbinden

22.04.2010 um 17:11 Uhr, 3540 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

FOR Schleife mit LOOP und nachfolgender FOR Schleife

gelöst Frage von miczarBatch & Shell6 Kommentare

Hallo zusammen, ich habe ein Problem mit einem Batchfile. Situation: im Netzwerk ist kein WINS mehr vorhanden und so ...

Batch & Shell

For Schleife kaputt?

gelöst Frage von Peter32Batch & Shell5 Kommentare

Hallo, ich finde den Fehler nicht irgendwie bekomme ich ständig denselben Inhalt in "Name.txt" und kann dann nicht weiterarbeiten ...

Batch & Shell

Wieder For-Schleifen

gelöst Frage von IleiesBatch & Shell1 Kommentar

Hallo zusammen, Wieder zurück zu den FOR-SCHLEIFEN: Wie kann ich das Ganze kürzen?

Microsoft

Skype for Business

Frage von xX-3PO-XxMicrosoft5 Kommentare

Geehrte Kollegen, ich benötige mal so ein paar Information zu Erfahrungen bei einer Umstellung auf Skype for Business. Hierbei ...

Neue Wissensbeiträge
Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 1 TagInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 2 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 4 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Sicherheit

Wikileaks-Gründer Julian Assange wurde festgenommen

Information von Frank vor 7 TagenSicherheit3 Kommentare

Wikileaks-Gründer Julian Assange wurde heute in London festgenommen. Die Botschaft Ecuadors, in der er seit sieben Jahren lebte, hat ...

Heiß diskutierte Inhalte
Tipps & Tricks
Verdammt voll erwischt
Frage von AlchimedesTipps & Tricks23 Kommentare

Folgende Mail habe ich auf meinem Freenet Account erhalten: Nun folgendes Problem: 1) Ich besuche Porno Seiten yep hat ...

Drucker und Scanner
Xerox 7328 muss jeden Tag neu installert werden
Frage von PN-SchrauberDrucker und Scanner20 Kommentare

hallo, ich habe in Problem mit einem unserer Drucker. Vorweg, die meisten unserer Netzwerkdrucker laufen über einen Druckserver, dieser ...

HTML
Google maps
Frage von jensgebkenHTML20 Kommentare

Hallo Gemeinschaft, hab mal ne Frage zu Maps - habe es hinbekommen, dass ich einen iframe link erstellen kann ...

Switche und Hubs
PC Verursach Probleme im Netzwerk
gelöst Frage von spoboeSwitche und Hubs16 Kommentare

Hallo zusammen, folgene Situation macht mich inzwischen ratlos: In unserem Betrieb ist ein Rechner über die Hausverkabelung an einem ...