parteyspeaka
Goto Top

Komplexe Umbenennung mit Variabler Zeichenlänge mittels Batch

Hallo Zusammen,

ich habe mal wieder den Weg zu euch gefunden da mitlesen mal nicht mehr reichte.

Wir haben folgendes Szenario was mir Kopfzerbrechen bereitet:

Via Scanner Scannen wie Akten welche Barcodes enthalten aus denen eine XML zur gescannten PDF erstellt wird. Diese heissen dann zB:

FastScan_7660823_2018-01-30_132252460.pdf
FastScan_7660823_2018-01-30_132252460.xml

Zu Problemen kommt es wenn am selben Tag, genauer gesagt zur gleichen Zeit mehrere Akten zu einem Fall gescannt werden. Dann haben wir zusätzlich Files wie diese:

FastScan_7660823_2018-01-30_132252460_20180130132315251.pdf
FastScan_7660823_2018-01-30_132252460_20180130132315251.xml

Hierbei kann es allerdings vorkommen das XML und PDT eine Hunderstel getrennt sind, also zB

FastScan_7660823_2018-01-30_132252460_20180130132315252.pdf
FastScan_7660823_2018-01-30_132252460_20180130132315251.xml

Dies führt zu Verarbeitungsproblemen in meinen Schnittstellen da er die Paare nicht mehr passend zusammenfindet. Deshalb war es meine Absicht vor Start der Schnittstellenverarbeitung mittels Batch die 3 Hunderstel-Stellen zu entfernen. Dank Lesen einiger eurer Themen bin ich jetzt so weit, sprich Namenlängeauslesen um besagte Stelle zu finden und wenn sie vorkommt halt cutten:

rem @echo off & 
setlocal enabledelayedexpansion 
set "Ordner=H:\Batchtest\INPUT"   

set /a Stellen=3
for /f "delims=" %%i in ('dir /s/b/a-d "%Ordner%\*.*"') do (  
set Name=%%~ni

call :StrLength !Name!
set /a StrLength = !StrLength!-%Stellen%
echo String length: !StrLength!
echo Name !Name!
set trim=!Name:~-18!
echo test !trim!
set trim1=!trim:~0,2!
echo test1 !trim1!
rem if %trim% == "_2" (  
echo ren "%%i" "!Name:~,%StrLength%!%%~xi" )  
echo move /-y %%i "H:\Batchtest\OUT"   
		
)

goto :eof
:StrLength 
set WorkString=%*
set Length=0
:StrLengthLoop
if not "!WorkString:~%StrLength%,1!"=="" (  
  set /a StrLength += 1
  goto StrLengthLoop
)
goto :eof

bei auskommentierter Zeile 17 erhalte ich folgende Ausgabe:

H:\Batchtest>goto :eof
String length: 52
Name FastScan_7854761_2018-01-30_071913568_20180130072028689
test _20180130072028689
test1 _2
ren "H:\Batchtest\INPUT\FastScan_7854761_2018-01-30_071913568_20180130072028689.xml" ".xml"  
move /-y %i "H:\Batchtest\OUT"  

ist Zeile 17 aktiv bekomme ich einen Syntaxfehler, habe es hier auch mit !trim1! probiert allerdings kommt er dann auch nicht ins IF hinein um das echo auszugeben. Sprich mein grossen Problem ist hier das korrekte einbauen des IFs, da ohne IF ich alles korrekt zum laufen kriege, allerdings sollen halt Dateien ohne Erweiterungszeitstempel garnicht angefasst werden. Wenn jemand aber noch andere Ideen hat wie ich das viel einfacher lösen kann sag ich auch nicht nein.

Gerne auch ne brauchbare Lösung mit nem Delimter daran bin ich total verzweifelt als ich versuchte ein IF über die Anzahl der Token zu generieren.

Content-Key: 363118

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

Printed on: April 28, 2024 at 16:04 o'clock

Mitglied: 135333
Solution 135333 Feb 01, 2018 updated at 10:48:23 (UTC)
Goto Top
Moin.
Würde ich schnell mit einem Powershell-Einzeiler abfackeln, wir sind ja nicht mehr in der Steinzeit ...
gci 'H:\Batchtest\INPUT\*' -include '*.pdf','*.xml' -recurse | ?{$_.Basename -match '_\d{17}$'} | rename-item -NewName {($_.Basename -replace '\d{3}$','') + $_.Extension} -Force  
Gruß snap
Member: parteyspeaka
parteyspeaka Feb 01, 2018 updated at 11:37:36 (UTC)
Goto Top
Zitat von @135333:

Moin.
Würde ich schnell mit einem Powershell-Einzeiler abfackeln, wir sind ja nicht mehr in der Steinzeit ...
> gci 'H:\Batchtest\INPUT\*' -include '*.pdf','*.xml' -recurse | ?{$_.Basename -match '_\d{17}$'} | rename-item -NewName {($_.Basename -replace '\d{3}$','') + $_.Extension} -Force  
> 
Gruß snap

hoi snap vielen dank

jetzt fühl ich mich alt :D ... die powershell ist irgendwie komplett an mir vorbeigegangen