pirat-ohne-bart
Goto Top

Dateien nach zweiter Stelle nach erstem Punkt im Dateinamen verschieben

Hallo Administratoren,

ich stehe vor folgender Problemstellung:

Ich benötige eine Batch-Datei, die Dateien aus einem bestimmten Ordner nach der zweiten Stelle nach dem ersten Punkt in ihrem Dateinamen in entsprechende Ordner sortiert.

Also zum Beispiel:
In C:\Unsortiert liegen die Dateien
ABCDEF.X1234.pdf
FGHIJK.X1342.pdf
GFGFGFGGGF.X2676.pdf
TTTTTGGG.X3234.pdf
546478.X3544.pdf


Es existieren bereits die Ordner
C:\sortiert\1
C:\sortiert\2
C:\sortiert\3

In diese Ordner soll die Batch-Datei nun die entsprechenden Dateien je nach dem, welches die zweite Stelle des Dateinamens nach dem ersten Punkt ist, einsortieren.

Könnt ihr mir vielleicht dabei helfen? Ich habe bereits dank eurer Hilfe in einem früheren Thread folgende Batch-Datei zur Hand, die allerdings den ersten Punkt vernachlässigt und nur die zweite Stelle im Dateinamen berücksichtigt:
@echo off &setlocal enabledelayedexpansion
set "source=c:\unsortiert"  
set "destination=c:\sortiert"  
For %%a in ("%source%\*") do (  
    Set "name=%%~nxa"  
    Set "folder=!name:~1,1!"  
    If not exist "%destination%\!folder!" md "%destination%\!folder!" >nul 2>&1  
    move "%%a" "%destination%\!folder!\"  
)

Vielen Dank sage ich schonmal im Voraus für all eure Bemühungen!

Liebe Grüße
pirat-ohne-bart

Content-Key: 399109

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

Printed on: May 3, 2024 at 20:05 o'clock

Member: NetzwerkDude
Solution NetzwerkDude Jan 23, 2019 updated at 10:33:30 (UTC)
Goto Top
Da ich leider kein Batch kann, hier ein Lösungsvorschlag in PowerShell:

$EingabePfad = "C:\Unsortiert"  
$ZielPfad = "C:\sortiert\"  

gci -Path $EingabePfad | ForEach-Object {
    if ($_.name -match '(?<=^\w*\.\w{1})\d{1}(?=\w*.pdf$)') {  
        $ZielOrdner = $Matches.Values
        Move-Item $_.FullName -Destination "$ZielPfad\$ZielOrdner"  
    }
}

Also anhand einer Look-Around Regex zu Prüfen welche Zahl beim Eingabeelement an der zweiten Stelle hinterm ersten Punkt steht, und anhand dieser die Sachen zu verschieben
Member: colinardo
Solution colinardo Jan 23, 2019 updated at 10:55:35 (UTC)
Goto Top
Servus @pirat-ohne-bart ,
Dafür schaltest du in der Batch einfach eine zweite For-Schleife hinter die erste, welche den Dateinamen mit dem Punkt als Delimiter zerlegt:
@echo off &setlocal enabledelayedexpansion
set "source=c:\unsortiert"  
set "destination=c:\sortiert"  
for %%a in ("%source%\*") do for /f "tokens=2 delims=." %%b in ("%%~na") do (  
    Set "name=%%b"  
    Set "folder=!name:~1,1!"  
    ff not exist "%destination%\!folder!" md "%destination%\!folder!" >nul 2>&1  
    move "%%a" "%destination%\!folder!\"  
)
Als Alternative noch eine Variante in Powershell
$source = 'C:\uinsortiert'  
$destination = 'C:\sortiert'  
gci $source -File | ?{$_.Basename -match '\..(.)'} | group {$matches[1]} | %{  
    $dest = "$destination\$($_.Name)"  
    if (!(Test-Path $dest)){md $dest -Force | out-null}
    $_.Group | move-item -Destination $dest -Verbose
}
Grüße Uwe