Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

String aus Dateinamen abfragen und ändern per Batch

Frage Entwicklung Batch & Shell

Mitglied: chainsaw

chainsaw (Level 1) - Jetzt verbinden

05.02.2009, aktualisiert 11:23 Uhr, 8639 Aufrufe, 8 Kommentare

Hallo Profis,

Ich hab hier ein Problem und komme mit meinen kleinen Batch-Kenntnissen nicht weiter.

Folgende Situation: Ich habe in einem Verzeichnis zig Dateien die so aussehen:

1GZTEST200902100010004402nnW00.dat

Diese möchte ich jetzt per Batch renamen. Bestimmte Teile des
Dateinamens sollen ersetzt werden, einige sollen so bleiben,
einige dürfen ganz verschwinden.

Eine fertige Datei sollte z.B. so aussehen:

GZ.TEST.20090210.001000.44.02.W.dat

Die ersten drei Namensteile kann ich mit set /p var ja ganz gut
abfragen und umbenennen (also GZ, TEST und das Datum.

Aber dann beginnen meine Schwierigkeiten: Den Abschnitt 001000
und der Buchstabe W sind immer verschieden und können z.B. bis 099000 gehen
und der Buchstabe W kann irgendeiner aus dem Alphabet sein.
Wie mache ich das nun, dass ich diese beiden Angaben im Dateiname
unverändert bleiben und im umbenannten File wieder so eingesetzt werden?

Wäre toll wenn ihr mit weiterhelfen könnet - das würde mir wahnsinnig
viel Arbeit sparen, denn eine externe Software darf ich nicht verwenden,
bzw. installieren.

Danke und Gruß
Andi
Mitglied: bastla
05.02.2009 um 11:41 Uhr
Hallo chainsaw und willkommen im Forum!
Hallo Profis,
Falls Du auch mit mir vorlieb nimmst , hätte ich etwa folgenden Ansatz zu bieten:
01.
@echo off & setlocal 
02.
set "Dateien=D:\Daten\*.dat" 
03.
set "T1=GZ" 
04.
set "T2=TEST" 
05.
set "T3=%date:~-4%%date:~-7,2%%date:~-10,2%" 
06.
 
07.
for /f "delims=" %%i in ("%Dateien%") do call :ProcessFile "%%i" 
08.
goto :eof 
09.
 
10.
:ProcessFile 
11.
set "Alt=%~n1" 
12.
set "T4=%Alt:~15,6%" 
13.
set "T5=%Alt:~21,2%" 
14.
set "T6=%Alt:~23,2%" 
15.
set "T7=%Alt:~27,1%" 
16.
 
17.
echo ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1" 
18.
goto :eof
Das "echo" vor dem "ren" soll ein gefahrloses Testen erlauben, da so der Umbenennungsbefehl jeweils nur angezeigt wird. Die Variablen %T1% und %T2% können dann natürlich wieder per "set /p" befüllt werden, und das Suchmuster "D:\Daten\*.dat" kann vielleicht auch noch etwas eingeschränkt werden (außer, es sollen ohnehin alle .dat-Dateien des Verzeichnisses bearbeitet werden).

Grüße
bastla
Bitte warten ..
Mitglied: chainsaw
05.02.2009 um 12:29 Uhr
Hallo bastla

Falls Du auch mit mir vorlieb nimmst

Ich würde sagen das das ganz klar Profimäßig ist was du da gepostet hast! Und so schnell - unglaublich.

Ich versteh ja nicht wirklich was da alles drinsteht, aber eine Frage habe ich noch:

Die Geschichte mit "%Alt:~21,2" usw. beschreibt das die Anzahl der Zeichen von links oder so?
Damit kann ich garnichts anfangen.
Die Stelle nach dem Datum hat z.B. eine "0" zuviel, und heißt 000100 statt 001000 muß ich da an den Werten spielen bis es passt, oder wo veränder ich da was?

Trotzdem sehr herzlichen Dank für deine schnelle Hilfe!

Gruß Andi
Bitte warten ..
Mitglied: bastla
05.02.2009 um 12:46 Uhr
Hallo chainsaw!

Die Geschichte mit "%Alt:~21,2" usw. beschreibt das die Anzahl der Zeichen von links oder so?
Der erste Wert gibt an, wie viele Zeichen (von links) übersprungen werden sollen, der zweite Wert, wie viele danach verwendet werden sollen - für die (nicht benötigte) 1 am Anfang des Dateinamens müsstest Du daher zB die Werte 0 (keine Stellen überspringen) und 1(eine Stelle verwenden) angeben.

Die Stelle nach dem Datum hat z.B. eine "0" zuviel, und heißt 000100 statt 001000 muß ich da an den Werten spielen bis es passt, oder wo veränder ich da was?
Bei meinem Test mit Deinem geposteten Beispiel
1GZTEST200902100010004402nnW00.dat 
               ^    ^ 
1234567890123456789012345678901234
war das Ergebnis zwar eigentlich wunschgemäß (nach den ersten 15 Zeichen sind die nächsten 6 Zeichen "001000"), aber Du kannst die Zuweisung zu %T4% ja in Zeile 12 entsprechend anpassen ...

Grüße
bastla
Bitte warten ..
Mitglied: chainsaw
05.02.2009 um 12:49 Uhr
Hallo nochmal ich,

also das mit der Stelle hab ich nach dem Try & Error-Verfahren hinbekommen.

Aber der batch benennt immer nur eine Datei um und bringt dann den
Fehler "Datei existiert bereits oder Datei konnte nicht gefunden werden".

Wäre ein Lösungsansatz, die renamte Datei in ein Out-Verzeichnis zu schieben?

Danke und Gruß ANdi
Bitte warten ..
Mitglied: bastla
05.02.2009 um 12:58 Uhr
Hallo chainsaw!
Aber der batch benennt immer nur eine Datei um und bringt dann den Fehler "Datei existiert bereits oder Datei konnte nicht gefunden werden".
Wäre ein Lösungsansatz, die renamte Datei in ein Out-Verzeichnis zu schieben?
Soferne durch das Weglassen von Informationen gleiche Dateinamen entstehen, würde das auch nicht helfen - daher vielleicht einmal mit folgender alternativen Zeile 17
>>D:\RenLog.txt echo ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1"
ein Protokoll der Simulation erstellen und die neu entstehenden Dateinamen vergleichen bzw als (ungetesteter) Ersatz der Zeile 17 mit
if not exist "%~dp1\%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1" ( 
    ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1" 
) else ( 
    echo %1 -- ^>"%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1" existiert bereits! 
)
anzeigen lassen, bei welchen Dateien es eine Namengleichheit geben würde.

Grüße
bastla
Bitte warten ..
Mitglied: chainsaw
05.02.2009 um 13:21 Uhr
Hallo bastla,

Jetzt bin ich völlig verwirrt und überfordert. Die Dateinamen sind eigentlich nicht gleich, denn Namen mit gleichem Datum und gleicher Seitenzahl unterscheiden sich ja durch den Buchstaben. Somit gibt`s eigentlch keine gleichen Dateinamen.


Nach dem rename Befehl habe ich jetzt folgendes eingefügt:

ren %1 "%zvar%.%avar%.%dvar%.%T4%.44.05.%T7%%~x1"
move D:\Daten\*_*.dat D:\Daten\out

if exist "%Dateien%" dir /b /A:-d "%Dateien%">nul 2>nul && goto :ProcessFile
if exist "%Dateien%" dir /b /A:-d "%Dateien%">nul 2>nul || goto :eof

Ich kann die Daten vorneweg auch GZ_ benennen und frage dann das Underline ab um wegzumoven.

if exist "%Dateien%" dir /b /A:-d "%Dateien%">nul 2>nul && goto :ProcessFile
if exist "%Dateien%" dir /b /A:-d "%Dateien%">nul 2>nul || goto :eof

Das stammt übrignes auch von dir hier aus dem Forum
und jetzt gehts. Ich bin glücklich und bedanke mich für deine Geduld und deine Hilfe! Echt Profimäßig!

Danke und Gruß
Andi
Bitte warten ..
Mitglied: bastla
05.02.2009 um 15:43 Uhr
Hallo chainsaw!

Sorry - in meinem nun wirklich nicht profimäßigen Ansatz ganz oben (war leider etwas abgelenkt) hätten die Zeile 2 und 7 richtig so aussehen sollen:
set "Dateien=D:\Daten"  
... 
for /f "delims=" %%i in ('dir /b "%Dateien%\*.dat"') do call :ProcessFile "%Dateien%\%%i"
Damit sollte dann auch ohne weitere Verrenkungen der Rest des Batches funktionieren ...

Den Hinweis "ungetestet" hatte ich übrigens nicht dabei, weil ich es ja mit einer Datei versucht hatte (mir ging es vorrangig um die Zerlegung des Namens) ...

Grüße
bastla
Bitte warten ..
Mitglied: chainsaw
06.02.2009 um 15:33 Uhr
Hallo bastla,

Perfekt! So klappt`s noch besser. Vielen Dank!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateinamen umschreiben batch (5)

Frage von jocheng zum Thema Batch & Shell ...

Batch & Shell
gelöst Datum per batch ändern in Tagen (2)

Frage von crawnby zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...