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 errorlevel
0
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.
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 –
@ WeFixIt: Keine Ahnung, da Sie nicht den Zielverzeichnisnamen für jede Ihrer nominierten Dateien angegeben haben. – Magoo
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 –