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

Variablenauflösung innerhalb verschachtelter FOR-Schleife

Frage Entwicklung Batch & Shell

Mitglied: matbuss

matbuss (Level 1) - Jetzt verbinden

22.04.2010 um 17:11 Uhr, 3468 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
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 ...

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

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...