2017-01-23 3 views
-2

Gefunden eine python Lösung here, aber ich brauche eine Batch-Datei-basierte Lösung.Batch-Datei zum Verschieben von Dateien basierend auf Teil des Dateinamens, in Ordner basierend auf Teil des Ordnernamens

Haben Sie viele Dateien:

  • SSP4325_blah-blah-blah.xml
  • JKP7645_blah.xml
  • YTG6457-blah-blah.xml

und Ordnernamen die einen Teil des Dateinamens enthalten:

  • RefID - SSP4325, JKP7645, GHT1278, YRR0023
  • RefID - YTG6457

Ich suche nach einer Batch-Lösung, die einen Teil des Dateinamens auf der Vorderseite lesen würde (vor dem ersten Gedankenstrich oder dem Unterstrich) und dann diese Datei in den Ordner verschieben, in dem die Vorderseite des Dateinamens als Teil des Ordnernamens existiert.

In den obigen Beispielen wurden also die ersten beiden Dateien (SSP4325 und JKP7645) in den ersten Ordner verschoben, da dieser Text als Teil des Ordnernamens enthalten war.

Die dritte Datei wird in den zweiten Ordner verschoben.

Ich habe Hunderte von Dateien und 63 Ordnern. Ich hoffe also, automatisieren zu können.

PowerShell oder Python kann aufgrund von Einschränkungen der Umgebung nicht verwendet werden. Ich hoffe auf einen Batch-Datei-Ansatz.

Danke. Sean.

Antwort

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.xml" ' 
) DO (
FOR /f "tokens=1delims=_-" %%b IN ("%%a") DO (
    FOR /f "delims=" %%d IN (
    'dir /b /ad "%destdir%\*%%b*" ' 
) DO (
    ECHO(MOVE "%%a" "%destdir%\%%d\" 
) 
) 
) 

GOTO :EOF 

Sie müssten die Einstellungen von sourcedir und destdir ändern, um Ihre Umstände anzupassen.

Die erforderlichen MOVE-Befehle sind lediglich ECHO für Testzwecke. Nachdem Sie überprüft haben, dass die Befehle korrekt sind, ändern Sie ECHO(MOVE in MOVE, um die Dateien tatsächlich zu verschieben. Anfügen >nul zu Berichtnachrichten unterdrücken (zB. 1 file moved)

Nachdem die Verzeichnisse zur Gründung legt die äußere Schleife den Dateinamen in %%a, die nächste Schleife den ersten Teil dieses Namens wird, bis zu, aber nicht einschließlich der ersten - oder _ (die delims angegeben) in %%b.

Die innere Schleife findet das Zielverzeichnis containng %%b im Zielverzeichnis und erstellt eine entsprechende move Zeile.

1

Diese Lösung überprüfen Sie die Ordner nur einmal und speichern Sie sie in einem Array, so sollte diese Methode schneller ausgeführt werden.

@echo off 
setlocal EnableDelayedExpansion 

rem Process the folders 
set i=0 
for /D %%a in (*) do (

    rem Store this folder in the next array element 
    set /A i+=1 
    set "folder[!i!]=%%a" 

    rem Separate folder in parts and store the number of the array element in each one 
    for %%b in (%%a) do set "part[%%b]=!i!" 

) 

rem Process the files 
for %%a in (*.xml) do (

    rem Get the first part of name 
    for /F "delims=-_" %%b in ("%%a") do (

     rem If such a folder exists... 
     if defined part[%%b] (

     rem Get the number of the corresponding array element and move the file 
     for %%n in (!part[%%b]!) do ECHO move "%%a" "!folder[%%n]!" 

    ) else (

     echo No folder exists for this file: "%%a" 

    ) 

    ) 
) 

Diese Methode hat auch einige Vorteile: Sie überprüfen können, ob ein bestimmte Ordner existiert nicht oder bekommen die Anzahl der Dateien in jeden Ordner verschoben, etc. Wenn Sie in diesen Punkten nicht daran interessiert sind, entfernen Sie einfach die if Befehl und machen Sie den Code einfacher ...

Eine Erläuterung der Array-Verwaltung in Batch-Dateien ist bei this answer gegeben.

Verwandte Themen