hiob08
Goto Top

Datei mit gleichnamigem Ordner verschieben?

Hallo zusammen,

suche eine Lösung für folgendes Problem:

Ich möchte ununterbrochen einen Ordner nach *.txt Dateien abfragen.
Befindet sich eine solche txt Datei im Ordner, soll das Skript 2 Sekunden warten und dann einen Ordner (der automatisch existiert, sobald die txt Datei existiert), welcher den gleichen Namen hat verschieben.

Also bsp.:
Datei: 12345.txt zusammen mit Ordner "12345" nach D:\Backup verschieben.

So weit bin ich schon:

 
:LOS
REM #### Da Win2k3 Resouce Kit nicht vorhanden
REM #### Trick, um unter Batch 2 Sekunden zu warten

PING 1.1.1.1 -n 1 -w 2000 >NUL

REM #### Prüfe, ob Datei vorhanden
D:
cd D:\Backup
if exists *.txt

--Und hier weiß ich nicht mehr weiter--

goto LOS

Hat hemand schonmal einen ähnlichen Fall gehabt?

Content-ID: 103632

Url: https://administrator.de/contentid/103632

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

bastla
bastla 09.12.2008 um 11:32:36 Uhr
Goto Top
Hallo hiob08!

So ganz klar ist mir Dein Vorhaben nicht - nach Deinem Batchansatz sieht es so aus, als wolltest Du in D:\Backup nachsehen, ob eine Textdatei existiert, die Du dann eigentlich erst dorthin verschieben willst ...

Falls gemeint wäre, dass diese Überprüpfung zB für den Ordner "D:\In" gemacht werden soll, dann etwa so:
@echo off & setlocal
:LOS
ping 127.0.0.1 -n 2>nul
for %%i in ("D:\In\*.txt") do (  
    move "%%i" "D:\Backup\">nul  
    move "%%~dpni" "D:\Backup\">nul  
)
goto :LOS
Falls es möglich wäre, dass ein gleichnamiger Ordner in "D:\Backup" bereits existiert, müsstest Du Dir überlegen, was in diesem Fall zu geschehen hat - ein Überschreiben ließe sich etwa so realisieren:
@echo off & setlocal
:LOS
ping 127.0.0.1 -n 2>nul
for %%i in ("D:\In\*.txt") do (  
    move "%%i" "D:\Backup\">nul  
    if exist "D:\Backup\%%~ni" (  
        rd /s /q "D:\Backup\%%~ni"  
        move "%%~dpni" "D:\Backup\">nul  
    )
)
goto :LOS
Grüße
bastla
hiob08
hiob08 09.12.2008 um 12:48:59 Uhr
Goto Top
Hallo bastla,

vielen dank für deine Antwort.

Hast schon recht, ist ein bißchen verwirrend. Ich versuche mal, dass ganze etwas übersichtlicher zu erklären.

Auf meinem Rechner gibt es einen Ordner D:\Backup.
In diesem Ordner befinden sich txt Dateien. Zu jeder txt Datei gibt es einen gleichnamigen Ordner, nur halt ohne die Endung txt, also bspw.
kjasdjhasdj.txt ->kjasdjhasdj

Der Ordner und die txt Datei werden von einem anderen Programm erzeugt. Ich möchte nun
ständig den Ordner antriggern und prüfen, ob sich eine txt Datei innerhalb des Ordners befindet. Wenn ja, soll sowohl die txt als auch der gleichnamige Ordner in ein anderes Verzeichnis gemoved werden.
bastla
bastla 09.12.2008 um 12:57:12 Uhr
Goto Top
Hallo hiob08!

Dann musst Du eigentlich nur im Batch oben "D:\Backup" auf "D:\Anderer Ordner" und "D:\In" auf "D:\Backup" ändern (was viel leichter ginge, wenn ich, wie üblich, Variablen verwendet hätte face-sad)...

... was aber noch offen bleibt, ist die Frage der möglichen Existenz eines gleichnamigen Ordners in "D:\Anderer Ordner" bzw der Reaktion darauf.

Grüße
bastla
hiob08
hiob08 09.12.2008 um 13:23:58 Uhr
Goto Top
Hallo nochmal,

vielen dank!
Ein gleichnamiger Ordner bzw. txt Datei kann sich eigentlich nicht im Zielordner befinden, bzw. es ist sehr unwahrscheinlich, weil die txt- Datei (und somit der Ordner) per %random%%random%%random% erzeugt werden face-wink Das könnte ich aber dann per
move /Y erledigen, oder? Dann soll halt der "alte" Ordner überschrieben werden.

Das Skript, welches du vorgeschlagen hast, scheint ja im ersten Augenblick nicht kompliziert. Denoch habe ich einige Fragen. Wenn du Zeit/Lust hast, würde ich mich über eine Antwort sehr freuen!

for %%i in ("D:\In\*.txt") do  
Kann ich hier %%i als eine Art Zählvariable sehen, die einfach nur zählt, wie viele txt Dateien sich in D:\In befinden, oder hat %%i in diesem Fall den Dateinamen inne?

Wieso heißt die Variable %%i und nicht bspw. %i%?

move "%%i" "D:\Backup\">nul   
Hiernach zu urteilen müsste in %%i der Dateiname stehen, richtig?
Und was macht das >nul am Ende der Zeile?

"%%~dpni"  
Und das überfordert mich leider komplett face-smile

Wie gesagt, ich weiß, dass es viele Fragen sind.. Würde mich sehr über eine Antwort freuen!

Danke nochmal!
bastla
bastla 09.12.2008 um 13:40:01 Uhr
Goto Top
Hallo hiob08!

Das könnte ich aber dann per move /Y erledigen, oder?
Abgesehen davon, dass "move" in einem Batch automatisch mit "/y" ausgeführt wird: Leider nein - um den bestehenden Ordner durch den neu zu verschiebenden zu ersetzen, müsstet Du die zweite Variante oben verwenden.

Wieso heißt die Variable %%i und nicht bspw. %i%?
Da es sich um eine "for"-Laufvariable (die tatsächlich den Dateipfad enthält) handelt, weist diese einige Besonderheiten auf - die Schreibweise ohne abschließendes "%" ist eine davon.

Eine weitere berührst Du mit Deiner dritten Frage: Es ist nur für Parametervariable (%0 bis %9) und die Variablen der "for"-Schleife möglich, eine Pfadzerlegung vorzunehmen - "%%dpni" liefert daher Laufwerk ("drive"), Pfad und Name (ohne "extension") der Datei in "%%i".

Durch die Schleife werden der Reihe nach alle im Ordner befindlichen Textdateien erfasst (es könnten ja während der Pause theoretisch auch 2 Ordner + Textdateien erstellt worden sein).

Mehr zum Thema findest Du unter "for /?" (wenn Du Dich bis zum Ende durchkämpfst face-wink).
Noch zum Rest der Frage 2: Das ">nul" hat nur optische Gründe - es wird damit die Ausgabe des "move"-Befehles ("1 Datei verschoben") nach "Nirgendwo" geschickt und damit unterdrückt.

Grüße
bastla
hiob08
hiob08 09.12.2008 um 15:36:09 Uhr
Goto Top
Funktioniert soweit alles!
SUPER!!! Danke für die blitzschnelle Hilfe face-smile