markusi
Goto Top

Platzhalter im Pfadnamen bei move, copy etc.

Hallo zusammen!
Ich habe ein für mich unlösbares Problem:

Ausgangslage:
Auf einem XP-Rechner werden in einem Verzeichnis durch ein Programm Verzeichnisse mit immer unterschiedlicher Bezeichnung erstellt; diese Verzeichnisse beinhalten ua. Daten, welche ich zur Weiterverarbeitung in andere Verzeichnisse verschieben will - am liebsten per Batch:

Bsp.:
Es werden unter C:\temp\eingang die Verzeichnisse vps12345, vps67890, vps09876, vps54321 angelegt; jedes Verzeichnis enthält ein weiteres Verzeichnis namens "Anlagen", dort befinden sich Dateien mit oder ohne Endung, sie beginnen aber IMMER mit KR oder UE.

Das Ziel ist es, die Dateien, beginnend mit KR in den Ordner C:\temp\data zu verschieben; die Dateien, beginnend mit UE in den Ordner C:\temp\prot, und abschließend die vps-Ordner zu löschen. Unter Linux klappt das auch mit dem * als Wildcard; leider muss es unter Windows irgendwie laufen.

Wäre schön, wenn mir jemand helfen könnte.

Vielen Dank.

Content-Key: 128491

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

Printed on: April 23, 2024 at 20:04 o'clock

Member: Marwed
Marwed Nov 03, 2009 at 09:17:08 (UTC)
Goto Top
@echo off

rem  Gruss, Marwed

:: Verteilen der Daten von c:\temp\eingang
:: Einlesen der gefundenen Files in temporäre Listen-Dateien, dann Verteilung in die Zielverzeichnisse

if exist c:\temp\eingang\vps* (

	if exist KRfiles.txt del /F /Q KRfiles.txt
	dir /b /s c:\temp\eingang\KR* >> KRfiles.txt
	for /F %%i in ( KRfiles.txt ) do (
		copy /V /Y %%i c:\temp\data > nul
	)

	if exist UEfiles.txt del /F /Q UEfiles.txt
	dir /b /s c:\temp\eingang\UE* >> UEfiles.txt
	for /F %%i in ( UEfiles.txt ) do (
		copy /V /Y %%i c:\temp\prot > nul
	)
)

:: Löscht Verzeichnis Eingang mit allen Unterverzeichnissen und erstellt es LEER neu
rd /S /Q c:\temp\eingang
md c:\temp\eingang

Gruß,
Marwed
Member: MarkusI
MarkusI Nov 03, 2009 at 09:42:06 (UTC)
Goto Top
1000 Dank! Ich teste gleich & berichte...hatte inzwischen was eigenes gebastelt, funktioniert prinzipiell genauso...ich stelle es mal auszugsweise rein (bitte nicht lachen face-wink

...

dir /B /s KR*.* > KR.txt

for /F %%i in (KR.txt) Do (
copy %%i C:\temp\eingang\data
)

dir /B /s UE*.* > UE.txt

for /F %%i in (UE.txt) Do (
copy %%i C:\temp\eingang\prot
)

...
Member: Marwed
Marwed Nov 03, 2009 at 10:05:59 (UTC)
Goto Top
[edit] ... die Wildcards so angeben KR* (da ja auch Dateien ohne Endung gefunden werden sollen) Schalter bei COPY und RD/MD setzen [\edit]

... sonst völlig richtig.

Du soltest aber noch etwas 'Fleisch' dranbasteln face-smile

Falls \data und \prot nicht existierten, würden sie nicht automatisch erstellt.
Also:
if not exist c:\temp\data\nul md c:\temp\data
if not exist c:\temp\prot\nul md c:\temp\prot

Sicherheit:
Löschen von \eingang nur, wenn Daten kopiert wurden.
Setze IN der Schleife eine Variable zB. DONE=1 (VOR der Schleife erst auf 0 setzen).
NACH der Schleife - vor dem Löschen von \eingang - prüfe mit IF anhand der Variablen, ob kopiert wurde.

Gruß,
Marwed
Member: bastla
bastla Nov 03, 2009 at 10:46:05 (UTC)
Goto Top
@Marwed
Etwas schlanker (nämlich ohene Temporärdatei, wenn diese nicht auch noch für andere Zwecke gebraucht werden sollte) ginge es (am Beispiel der Zeilen 11 bis 14) so:
for /f "delims=" %%i in ('dir /b /s c:\temp\eingang\KR*') do copy /V "%%i" c:\temp\data >nul
Ob der "copy"-Schalter "/V" für mehr als Abwärtskompatibilität steht, kann Dir im Zweifelsfall Biber sagen - "/Y" braucht es in einem Batch allerdings sicher nicht, da defaultmäßig überschrieben wird (siehe "copy /?"; gilt auch für "move").

Ich setze zwar im Zweifelsfall ohnehin eher zu viele Anführungszeichen, aber um "%%i" herum würden ich sie keinesfalls weglassen (und da ich eben grundsätzlich mögliche Leerzeichen in Pfad / Dateiname berücksichtige, auch noch "delims=") ...

Grüße
bastla
Member: MarkusI
MarkusI Nov 03, 2009 at 13:53:29 (UTC)
Goto Top
Ich danke euch für euere Unterstützung!

VG

Markus
Member: Marwed
Marwed Nov 03, 2009 at 19:27:17 (UTC)
Goto Top
@bastla

... DAS ISSES ... !
Logisch, den Befehl (dir) gleich in die Schleife hau'n face-smile)
Mit mehr Nachdenken hätte mir das auch einfallen müssen ...
face-smile)
thx