Probleme mit For-Schleife und Variablen
Hallo zusammen,
ich hab ein kleines Problem mit meinem Skript.
Zunächst zum Hintergrund:
Ich prüfe einen Ordner auf eine txt Datei. Ist diese vorhanden, prüfe ich noch ob die gleichnamigen pdf und
doc Dateien vorhanden sind. Ist dies der Fall, werden die Dateien gemoved.
Sofern sie nicht vorhanden sind, werden alle vorhandenen Dateien in ein Error Verzeichnis gemoved.
Hier der Quelltext:
Komischerweise landet das Skript immer im ELSE Zweig, auch wenn das Trippel vollständig ist. Die Dateien werden dann in das Error Verzeichnis verschoben.
Ich glaub ich seh einfach vor lauter Bäumen den Wald nicht
Hoffe, ihr könnt mir helfen
ich hab ein kleines Problem mit meinem Skript.
Zunächst zum Hintergrund:
Ich prüfe einen Ordner auf eine txt Datei. Ist diese vorhanden, prüfe ich noch ob die gleichnamigen pdf und
doc Dateien vorhanden sind. Ist dies der Fall, werden die Dateien gemoved.
Sofern sie nicht vorhanden sind, werden alle vorhandenen Dateien in ein Error Verzeichnis gemoved.
Hier der Quelltext:
@echo off
--- Hier werden die Ordnervariablen Error, Target , Log und Workdir gesetzt ----
for %%i in ("C:\Test\*.TXT") do (
if exist "%workdir%\%%~ni.pdf" (set pdf_ja="x")
if exist "%workdir%\%%~ni.doc" (set doc_ja="x")
if "%pdf_ja%"=="x" (
if "%doc_ja%"=="x" (
move %%~ni.pdf %target%
move %%~ni.doc %target%
move %%i %target%
))
else (
echo %date% - %time:~0,8% : ERROR : Dateitrippel unvollständig >> %log%
move %%i %error%
move %%~ni.pdf %error%
move %%~ni.doc %error%
)
)
Komischerweise landet das Skript immer im ELSE Zweig, auch wenn das Trippel vollständig ist. Die Dateien werden dann in das Error Verzeichnis verschoben.
Ich glaub ich seh einfach vor lauter Bäumen den Wald nicht
Hoffe, ihr könnt mir helfen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 112390
Url: https://administrator.de/forum/probleme-mit-for-schleife-und-variablen-112390.html
Ausgedruckt am: 23.12.2024 um 09:12 Uhr
6 Kommentare
Neuester Kommentar
Moin hiob08,
für die CMD.exe ist alles, was innerhalb einer FOR-Anweisung oder auch innerhalb einer IF ..ELSE -Struktur passiert eine Zeile, eine Anweisung, auch wenn es aus Lesbarkeitsgründen auf 20 zeilen auseinadergezogen wird.
Und in einer Anweisung werden %variablen% eben nur einmalig aufgelöst (=durch Werte ersetzt), nämlich beim Parsen der Syntax VOR der eigentlichen Ausführung.
Wenn man/frau es anders haben will, also möchte, dass die Variablen nicht alle vor Beginn der Ausführung der ganzen Anweisung aufgelöst werden sollen, sondern innerhalb der Anweisung aktualisierte Werte zugewiesen bekommen, dann muss "DelayedExpansion" = "verzögerte Variablenauflösung" angekündigt werden.
Außer der Ankündigung "setlocal EnableDelayedExpansion" sind die Variablen, die erst unmittelbar beim In-die-Hand-nehmen aufzulösen sind mit der Schreibweise !variable! statt %variable% zu schreiben.
Grüße
Biber
für die CMD.exe ist alles, was innerhalb einer FOR-Anweisung oder auch innerhalb einer IF ..ELSE -Struktur passiert eine Zeile, eine Anweisung, auch wenn es aus Lesbarkeitsgründen auf 20 zeilen auseinadergezogen wird.
Und in einer Anweisung werden %variablen% eben nur einmalig aufgelöst (=durch Werte ersetzt), nämlich beim Parsen der Syntax VOR der eigentlichen Ausführung.
Wenn man/frau es anders haben will, also möchte, dass die Variablen nicht alle vor Beginn der Ausführung der ganzen Anweisung aufgelöst werden sollen, sondern innerhalb der Anweisung aktualisierte Werte zugewiesen bekommen, dann muss "DelayedExpansion" = "verzögerte Variablenauflösung" angekündigt werden.
@echo off & setLocal EnableDelayedExpansion
--- Hier werden die Ordnervariablen Error, Target , Log und Workdir gesetzt ----
for %%i in ("C:\Test\*.TXT") do (
if exist "%workdir%\%%~ni.pdf" (set pdf_ja="x")
if exist "%workdir%\%%~ni.doc" (set doc_ja="x")
if "!pdf_ja!"=="x" (
if "!doc_ja!"=="x"
move %%~ni.pdf %target%
move %%~ni.doc %target%
move %%i %target%
))
else (
echo %date% - %time:~0,8% : ERROR : Dateitrippel unvollständig >> %log%
move %%i %error%
move %%~ni.pdf %error%
move %%~ni.doc %error%
)
)
Grüße
Biber
Moin hiob,
sorry, ich hatte gestern zu flüchtig gelesen.
Das nächste Problem ist natürlich, dass die Variablen anders gesetzt sind als sie geprüft werden.
Wenn Du setzt:
---> was es natürlich nicht lesbarer macht.
Bitte ändere bei den beiden SETs von pdf_ja und doc ja die Anführungszeichen so:
Grüße
Biber
sorry, ich hatte gestern zu flüchtig gelesen.
Das nächste Problem ist natürlich, dass die Variablen anders gesetzt sind als sie geprüft werden.
Wenn Du setzt:
set pdf_ja="x"
... dann müsstest Du ja prüfen auf"!pdf_ja!"==""x""
---> was es natürlich nicht lesbarer macht.
Bitte ändere bei den beiden SETs von pdf_ja und doc ja die Anführungszeichen so:
...
...
if exist "%workdir%\%%~ni.pdf" set "pdf_ja=x"
if exist "%workdir%\%%~ni.doc" set "doc_ja=x"
Grüße
Biber
Moin hiob08,
dann fasst die cmd.exe wohl die IF..ELSE-Konstrukte logisch anders auf als du sie optisch formatiert und auch gemeint hast.
Aber dieses Problem des Aneinandervorbeiredens ist nichts batchspezifisches...
Das hab ich jeden gottverdammten Tag mit meinen Kollegen auch ...
Vielleicht so geklammert?
Grüße
Biber
dann fasst die cmd.exe wohl die IF..ELSE-Konstrukte logisch anders auf als du sie optisch formatiert und auch gemeint hast.
Aber dieses Problem des Aneinandervorbeiredens ist nichts batchspezifisches...
Das hab ich jeden gottverdammten Tag mit meinen Kollegen auch ...
@echo off & setLocal EnableDelayedExpansion
--- Hier werden die Ordnervariablen Error, Target , Log und Workdir gesetzt ----
for %%i in ("C:\Test\*.TXT") do (
if exist "%workdir%\%%~ni.pdf" (
if exist "%workdir%\%%~ni.doc" (
move %%~ni.pdf %target%
move %%~ni.doc %target%
move %%i %target%
)
) else (
echo %date% - %time:~0,8% : ERROR : Dateitrippel unvollständig >> %log%
move %%i %error%
move %%~ni.pdf %error%
move %%~ni.doc %error%
)
)
Grüße
Biber