2017-11-13 3 views
0

hoffen, dass Sie mir dabei helfen kann, kann ich es nicht, was ich braucheBatch Copy und In den Unterordner

Ich brauche alle PDF-Dateien von einem Quellordner zu kopieren, erstellen Sie einen Ordner mit Teil des Namens "T-123456" und fügen Sie die entsprechenden PDF-Dateien in den richtigen Ordner im Zielordner, aber manchmal den Namen, den es variiert oder die Referenz ändern "SM17-123".

Beispiel von Dateien
HC002T-1234562436787004332
MV002T-1234562436787004332
PP _002_T-123456_24_3678_7004332

Typen von direfents Dateien
HC123CLG-32-172436787004259
HC123SM17-1802436787004044

ich habe dieser Code erstellt, aber es macht einen Teil des Jobs, weil der Name variiert und Ordner falsch für das Erstellen erstellen Dateien, manchmal haben die Dateien mehr Ziffern im Anfangsbeispiel 001 oder 0001, so dass ich nicht weiß, wie man die anderen Referenzen Dateien weglässt und nur mit den Dateien "T-123456" funktioniert Quellordner und wenn ich ein anderes routhe wo ich andere Dateitypen habe und auf die richtige Referenz kopieren, wäre es toll.

@echo off 
title Electronic File 

:loop 
cls 
timeout -t 1 >nul 
color b 
for %%A in (*.pdf) do (
    echo File Found %%A 
    for /f "delims=" %%B in ("%%A") do set fname=%%~nB 
    for /f "delims=" %%C in ("%%A") do set fextn=%%~xC 
    for /f "tokens=1* delims=" %%D in ("!fname:~5,8!") do set folname=%%D 
    echo Name folder !folname! 
    if not exist "!folname!" (
     echo Folder !folname! dont exist, creating 
     md "!folname!" 2>nul 
    ) else (
     echo Folder !folname! exists 
    ) 
    echo Copying file %%A to folder !folname! 
    xcopy "%%A" "!folname!" 
    ) 

echo on 

md "C:\test %All%" 

xcopy /s /y "X:\test\pdf" "W:\Electronic File %All%" 

goto :loop 

pause 

Antwort

0
for %%A in (*.pdf) do (
    echo File Found %%A 
    set fname=%%~nA 
    set fextn=%%~xA 
    set folname=!fname:~5,8! 
    ECHO !folname!|FINDSTR /i /r "[A-Z]-[0-9][0-9][0-9][0-9][0-9][0-9]" >NUL 
    IF ERRORLEVEL 1 (
    ECHO %%A - !folname! excluded 
    ) ELSE (
    echo Name folder !folname! 
    if not exist "!folname!" (
     echo Folder !folname! dont exist, creating 
     ECHO md "!folname!" 2>nul 
    ) else (
     echo Folder !folname! exists 
    ) 
    echo Copying file %%A to folder !folname! 
    ECHO xcopy "%%A" "!folname!" 
    ) 
) 

Hier ist das Fleisch der Sache. delayedexpansion muss aktiviert sein - dies wird in Ihrem ursprünglichen Code nicht angezeigt.

Beachten Sie, dass keine Notwendigkeit besteht für %%B ist, %%C, %%D wie in der Schleife enthält %%A den Dateinamen und daher können Sie die Variablen aus diesem Namen set.

Beachten Sie, dass fextn wird immer immer .pdf da dies die Erweiterung ist, die Sie in Ihrer Dateimaske *.pdf angeben, so scheint es überflüssig.

Die Syntax SET "var=value" (wobei der Wert möglicherweise leer ist) kann verwendet werden, um sicherzustellen, dass etwaige nachgestellte Leerzeichen NICHT in dem zugewiesenen Wert enthalten sind.

Die Änderung, die ich eingeführt habe, ist zu echo der Verzeichnisname zu findstr, /i Fall-unsensibel für /r einen regulären Ausdruck suchen, die einen Buchstaben ist, einen Bindestrich und dann 6 Numerik. Wenn der Verzeichnisname übereinstimmt, wird errorlevel auf 0 von findstr festgelegt, andernfalls wird er auf 1 gesetzt.

Die if errorlevel 1 bedeutet „wenn Errorlevel 1 oder größer ist“, und wenn das so ist, war das Spiel UN erfolgreich, so melden Sie die Dateinamen und extrahierte Verzeichnisnamen; andernfalls, gehen Sie durch Ihre Logik (ich habe es geändert, um einfach echo die md und xcopy Befehle, zum Testen).


Da wir jetzt eine variable Struktur haben,

for %%A in (*.pdf) do (
    echo File Found %%A 
    set "copied=" 
    set fname=%%~nA 
    set fextn=%%~xA 
    set folname=!fname:~5,8! 
    ECHO !folname!|FINDSTR /i /r "[A-Z]-[0-9][0-9][0-9][0-9][0-9][0-9]" >NUL 
    IF not ERRORLEVEL 1 call :process "%%A" 

    rem repeat this section for each match required - begin 
    if not defined copied (
    set folname=!fname:~5,9! 
    ECHO !folname!|FINDSTR /i /r "[A-Z][A-Z][A-Z]-[0-9][0-9]-[0-9][0-9]" >NUL 
    IF not ERRORLEVEL 1 call :process "%%A" 
    ) 
    rem repeat this section for each match required - end 

    if not defined copied ECHO %%A - !folname! excluded 
) 
goto :eof 

:process 
echo Name folder %folname% 
if not exist "%folname%" (
echo Folder %folname% dont exist, creating 
ECHO md "%folname%" 2>nul 
) else (
    echo Folder %folname% exists 
) 
echo Copying file %~1 to folder %folname% 
ECHO xcopy "%~1" "%folname%" 
set "copied=Y" 
goto :eof 

In Ihrer erweiterten Beispiele, es ist nicht klar, wo die PP in das Schema passt.

Die Formel ist relativ einfach. Die Startposition ist das erste Argument in set (beginnend mit dem ersten Zeichen = 0) und die zweite die zu wählende Länge. Die regex Übereinstimmung kann entweder ein einzelnes Zeichen sein (wörtlich angepasst) oder [rangestart-rangeend] . entspricht einem beliebigen Zeichen, so dass der erste angezeigte Block HC123CLG-32-172436787004259 ab dem 5. Zeichen (beginnend mit 0) für 9 Zeichen = CLG-32-17 auswählt und vergleicht dies mit Alpha, Alpha, Alpha, -, numerisch, numerisch, -, numerisch, numerisch.

auf einem Spiel wird errorlevel0 zu setzen, so dass die :process Subroutine sind call ed, mit einem Parameter von %%A in Anführungszeichen. Das Unterprogramm verwendet den Wert in folname und kopiert die Datei (Name jetzt in %1 - %~1 entfernt die Anführungszeichen) wie zuvor.

Also - es ist so einfach wie das Wiederholen des Codeblocks, Ändern des Anfangs und der Länge des zu wählenden Strings und Ändern des regex, um dem erforderlichen Muster zu entsprechen.

+0

Großartig, tha hilf mir sehr, eine andere Frage ist, ob ich mehr Arten von Namensdateien habe, wie kann ich diesen Code hinzufügen? HC123CLG-32-172436787004259 HC123SM17-1802436787004044 und mit diesem Code haben einige Dateien HC0002T-1234562436787004332 eine weitere Nummer in der Reihenfolge der Datei, so wenn sie das Skript starten sie diese Datei weglassen, aber ich muss den gleichen Prozess –

+0

@ WeFixIt: Keine Ahnung, da Sie nicht den Zielverzeichnisnamen für jede Ihrer nominierten Dateien angegeben haben. – Magoo

+0

Alle Dateien befinden sich im selben Verzeichnis, davor verschiebe ich die Ordner in ein anderes Verzeichnis. HC002 *** T-123456 *** 2436787004332 MV002 *** T-123456 *** 2436787004332 PP _002 _ *** T-123456 *** _ 24_3678_7004332 HC123 *** CLG-32-17 *** *** 2436787004259 HC123 SM17-18 *** 02436787004044 HC123 *** EVM-64-17 *** 2436787004259 auch im gleichen Verzeichnis ich habe diese Dateien F *** T-123456 *** und XML *** T-123456 *** Manchmal ändern sich die Regeln, weil nach dem T- die Anzahl der Ziffern 3 oder 4 sein kann, mache ich es fett zu der Referenz, die nur zählt –

Verwandte Themen