14216
22.06.2005, aktualisiert am 31.08.2005
22570
23
0
Kann Batchdatei Dateinamen einlesen und ändern?
Hallo zusammen,
ich möchte mittels einer Batchdatei mehrere Dateien umbenennen.
Dazu sollte die Batchdatei die Namen einlesen und nach einem bestimmten Muster wieder ausgeben.
Ist dies überhaupt möglich?
Kanten
ich möchte mittels einer Batchdatei mehrere Dateien umbenennen.
Dazu sollte die Batchdatei die Namen einlesen und nach einem bestimmten Muster wieder ausgeben.
Ist dies überhaupt möglich?
Kanten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 12219
Url: https://administrator.de/forum/kann-batchdatei-dateinamen-einlesen-und-aendern-12219.html
Ausgedruckt am: 23.12.2024 um 04:12 Uhr
23 Kommentare
Neuester Kommentar
Also, Kanten,
Du hörst es wahrscheinlich nicht gerne bzw. weißt es schon ein paar Tage länger,
Eure Endanwender/Anforderer haben echt ne Panne... *Kopfschüttel
Machbar ist ja alles, aber diese Sachzwänge würde ich schon gern kennenlernen, die zu diesen Dateinamen geführt haben.
Bei dem Batch gibt es (außer der Nicht-Nachvollziehbarkeit dieses Spaghetti-Codes *gg) noch drei Restriktionen:
1) so wie es ist, muss das Batchelchen in dem Verzeichnis mit Deinen *.txt-Dateien laufen
2) die *.txt-Dateien in diesem Verzeichnis umbenennen? ich würde die lieber kopieren.. entkommentier Dir die entsprechende Lieblings-Echozeile unten
3) Fest verdrahtet ist die Annahme, dass in den Ursprungsdateien der Trenner GENAU EIN "-" ist UND ein wegzuschmeißendes Leerzeichen IMMER folgt.
Sollte das nicht so sein, bitte ändern.
Mit Deinen beiden Beispiel-Dateinamen klappt es jedenfalls, aber weiter teste ich nicht, sonst kommt mir irgendein Crack mit einem *.vbs-Skript zuvor.
Bin im Biergarten bei den anderen.
Batch folgt..
Hope It Helps
Frank /der Biber aus Bremen
::-- Kantenspecial.bat
@echo off
::set DEBUGMYBATCHES=42
setlocal
::Set My16Spaces="1234567890123456"
Set My16Spaces=" "
::Bitte My16Spaces mit 16 SPACES auffüllen, werden hier nicht angezeigt auf dieser Seite!
::
:: .. noch ne Anmerkung: ob der "dir"-Befehl mit der Maske "*-*.txt" unter allen DOSen klappt, weiß niemand..
for /F "delims=- tokens=1,*" %%i in ('dir /b *-*.txt') do call :loop "%%i" "%%j" "%%i-%%j"
goto FireAbend
:loop
set Part1=%1
set part1=%part1:~0,-1%%My16Spaces:~1,16%.
if "%Part1:~16,2%" GTR " " (set Part1=%Part1:~1,15%.) else set Part1=%Part1:~1,16%
set Part2=%2
set part2=%part2:~1,-5%%My16Spaces:~1,16%.
if "%Part2:~16,2%" GTR " " (set Part2=%Part2:~1,15%.) else set Part2=%Part2:~1,16%
echo "123456789012345.1234567890123456.txt" (Nur zum Testen)
echo "%part1%%part2%.txt"
echo Und Nun?? Rename oder Copy??:
echo entweder Ren %3 "%part1%%part2%.txt"
echo oder ein Copy %3 "\anderesDir\%part1%%part2%.txt" && del %3
goto :eof
:FireAbend
Endlocal
:: -- Ende Kantenspecial.bat
Du hörst es wahrscheinlich nicht gerne bzw. weißt es schon ein paar Tage länger,
Eure Endanwender/Anforderer haben echt ne Panne... *Kopfschüttel
Machbar ist ja alles, aber diese Sachzwänge würde ich schon gern kennenlernen, die zu diesen Dateinamen geführt haben.
Bei dem Batch gibt es (außer der Nicht-Nachvollziehbarkeit dieses Spaghetti-Codes *gg) noch drei Restriktionen:
1) so wie es ist, muss das Batchelchen in dem Verzeichnis mit Deinen *.txt-Dateien laufen
2) die *.txt-Dateien in diesem Verzeichnis umbenennen? ich würde die lieber kopieren.. entkommentier Dir die entsprechende Lieblings-Echozeile unten
3) Fest verdrahtet ist die Annahme, dass in den Ursprungsdateien der Trenner GENAU EIN "-" ist UND ein wegzuschmeißendes Leerzeichen IMMER folgt.
Sollte das nicht so sein, bitte ändern.
Mit Deinen beiden Beispiel-Dateinamen klappt es jedenfalls, aber weiter teste ich nicht, sonst kommt mir irgendein Crack mit einem *.vbs-Skript zuvor.
Bin im Biergarten bei den anderen.
Batch folgt..
Hope It Helps
Frank /der Biber aus Bremen
::-- Kantenspecial.bat
@echo off
::set DEBUGMYBATCHES=42
setlocal
::Set My16Spaces="1234567890123456"
Set My16Spaces=" "
::Bitte My16Spaces mit 16 SPACES auffüllen, werden hier nicht angezeigt auf dieser Seite!
::
:: .. noch ne Anmerkung: ob der "dir"-Befehl mit der Maske "*-*.txt" unter allen DOSen klappt, weiß niemand..
for /F "delims=- tokens=1,*" %%i in ('dir /b *-*.txt') do call :loop "%%i" "%%j" "%%i-%%j"
goto FireAbend
:loop
set Part1=%1
set part1=%part1:~0,-1%%My16Spaces:~1,16%.
if "%Part1:~16,2%" GTR " " (set Part1=%Part1:~1,15%.) else set Part1=%Part1:~1,16%
set Part2=%2
set part2=%part2:~1,-5%%My16Spaces:~1,16%.
if "%Part2:~16,2%" GTR " " (set Part2=%Part2:~1,15%.) else set Part2=%Part2:~1,16%
echo "123456789012345.1234567890123456.txt" (Nur zum Testen)
echo "%part1%%part2%.txt"
echo Und Nun?? Rename oder Copy??:
echo entweder Ren %3 "%part1%%part2%.txt"
echo oder ein Copy %3 "\anderesDir\%part1%%part2%.txt" && del %3
goto :eof
:FireAbend
Endlocal
:: -- Ende Kantenspecial.bat
Hallo Kanten,
mit einem Batch kann ich dir nicht dienen.
Wenn es auch vbs sein darf...?
'<<<<<<<bef>>>>>>>
' RenFile.vbs
'''''''''''''''''''''''''''''''''''''
Option Explicit
Dim objFSO, objFld, objFiles, objFile
Dim strFileSrc, strFileDst, strExt, strPath
Dim arrFileName
Dim i, j
strPath = "D:\Test\"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFld = objFSO.GetFolder(strPath)
Set objFiles = objFld.Files
For Each objFile in objFiles
strFileSrc = objFile.Name
strExt = Right(strFileSrc, 4)
strFileSrc = Left(strFileSrc,Len(strFileSrc) - 4)
arrFileName = Split(strFileSrc, " - ")
For i = 0 To 1
If Len(Trim(arrFileName(i))) > 16 Then
If i = 0 Then
arrFileName(i) = Left(arrFileName(i), 15) & "."
Else
arrFileName(i) = Left(arrFileName(i), 16)
End If
ElseIf Len(Trim(arrFileName(i))) = 16 Then
arrFileName(i) = arrFileName(i)
ElseIf Len(Trim(arrFileName(i))) < 16 Then
For j = 1 To 16 - Len(Trim(arrFileName(i)))
arrFileName(i) = arrFileName(i) & " "
Next
End If
Next
strFileDst = arrFileName(0) & arrFileName(1) & strExt
objFSO.MoveFile strPath & strFileSrc & strExt, strPath & strFileDst
Next
'<<<<<<<oef>>>>>>>
Die Variable strPath MUSS mit einen Backslash abgeschlossen sein.
Ich hab das Script ein paar mal durchlaufen lassen, hat funktioniert.
Ansonsten ist es ungestestet, ohne Fehlerbehandlung und nicht optimiert.
So, nun zieht es auch mich in den Biergarten, wo die Kollegen wahrscheinlich schon lange sind
Prost
mit einem Batch kann ich dir nicht dienen.
Wenn es auch vbs sein darf...?
'<<<<<<<bef>>>>>>>
' RenFile.vbs
'''''''''''''''''''''''''''''''''''''
Option Explicit
Dim objFSO, objFld, objFiles, objFile
Dim strFileSrc, strFileDst, strExt, strPath
Dim arrFileName
Dim i, j
strPath = "D:\Test\"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFld = objFSO.GetFolder(strPath)
Set objFiles = objFld.Files
For Each objFile in objFiles
strFileSrc = objFile.Name
strExt = Right(strFileSrc, 4)
strFileSrc = Left(strFileSrc,Len(strFileSrc) - 4)
arrFileName = Split(strFileSrc, " - ")
For i = 0 To 1
If Len(Trim(arrFileName(i))) > 16 Then
If i = 0 Then
arrFileName(i) = Left(arrFileName(i), 15) & "."
Else
arrFileName(i) = Left(arrFileName(i), 16)
End If
ElseIf Len(Trim(arrFileName(i))) = 16 Then
arrFileName(i) = arrFileName(i)
ElseIf Len(Trim(arrFileName(i))) < 16 Then
For j = 1 To 16 - Len(Trim(arrFileName(i)))
arrFileName(i) = arrFileName(i) & " "
Next
End If
Next
strFileDst = arrFileName(0) & arrFileName(1) & strExt
objFSO.MoveFile strPath & strFileSrc & strExt, strPath & strFileDst
Next
'<<<<<<<oef>>>>>>>
Die Variable strPath MUSS mit einen Backslash abgeschlossen sein.
Ich hab das Script ein paar mal durchlaufen lassen, hat funktioniert.
Ansonsten ist es ungestestet, ohne Fehlerbehandlung und nicht optimiert.
So, nun zieht es auch mich in den Biergarten, wo die Kollegen wahrscheinlich schon lange sind
Prost
Also ich habe ein ähnlich gelagertes Problem, aber es ist mir noch nicht so richtig gelungen, das Beispiel umzuschreiben:
In einem Verzeichnis liegen beliebige Dateien, also mit unterschiedlichen Dateiendungen. Alle Dateien beginnen aber mit "temp", z.B.
tempMauerblümchen.mp3
tempAnleitung.doc
tempRechnung-2005-04-07.xls
Das Batch-Skript soll nun alle Dateien im verzeichnis umbenennen, indem das "temp" entfernt wird. Die dateien sollen nach dem Batch also
Mauerblümchen.mp3
Anleitung.doc
Rechnung-2005-04-07.xls
heißen.
Wäre für einen Tip dankbar.
Das ganze unter Windows 2000
Maximilianus
In einem Verzeichnis liegen beliebige Dateien, also mit unterschiedlichen Dateiendungen. Alle Dateien beginnen aber mit "temp", z.B.
tempMauerblümchen.mp3
tempAnleitung.doc
tempRechnung-2005-04-07.xls
Das Batch-Skript soll nun alle Dateien im verzeichnis umbenennen, indem das "temp" entfernt wird. Die dateien sollen nach dem Batch also
Mauerblümchen.mp3
Anleitung.doc
Rechnung-2005-04-07.xls
heißen.
Wäre für einen Tip dankbar.
Das ganze unter Windows 2000
Maximilianus
Moin, Maxi...
Eine Strategie könnte sein:
.. Dateinamen (ohne Pfad) in Variable %Dateiname% einlesen
.. Set DateinamenOhneTemp=%Dateiname:~4%
(also die konstant lange Zeichenfolge "temp" abschneiden.)
Dann ein Rename wie in der Skizze oben.
Wenn es nicht reicht, poste von deinem Batch, was an Gerüst da ist, dann machen wir den Rest hier.
Frank / der Biber aus Bremen
Eine Strategie könnte sein:
.. Dateinamen (ohne Pfad) in Variable %Dateiname% einlesen
.. Set DateinamenOhneTemp=%Dateiname:~4%
(also die konstant lange Zeichenfolge "temp" abschneiden.)
Dann ein Rename wie in der Skizze oben.
Wenn es nicht reicht, poste von deinem Batch, was an Gerüst da ist, dann machen wir den Rest hier.
Frank / der Biber aus Bremen
Schau dir doch mal das Progamm hier an, für deine Anforderungen dürfte das genau passen.
http://it-falke.com/software/renamefiles/de_description.php
http://it-falke.com/software/renamefiles/de_description.php
.. Dateinamen (ohne Pfad) in Variable
%Dateiname% einlesen
.. Set DateinamenOhneTemp=%Dateiname:~4%
(also die konstant lange Zeichenfolge
"temp" abschneiden.)
Dann ein Rename wie in der Skizze oben.
%Dateiname% einlesen
.. Set DateinamenOhneTemp=%Dateiname:~4%
(also die konstant lange Zeichenfolge
"temp" abschneiden.)
Dann ein Rename wie in der Skizze oben.
Nachdem ich mich noch etwas mit der Syntax rumgeschlagen habe, sieht es so aus, als ob dieses funktionieren würde:
setlocal
FOR %%i in (*.*) do call :loop "%%i"
:loop
set part1=%1
set part1=%part1:~5%
@echo %1
@echo %part1%
Ren %1 "%part1%"
goto :eof
:FireAbend
Endlocal
Maximilianus
Schau dir doch mal das Progamm hier an,
für deine Anforderungen dürfte das
genau passen.
http://it-falke.com/software/renamefiles/de_description.php
für deine Anforderungen dürfte das
genau passen.
http://it-falke.com/software/renamefiles/de_description.php
Nein, das ist ein Programm und kein Batch-Skript. Ich suche aber ein Batch-Skript.
Danke,
Maximilianus
War schon fast richtig...
In der :loop-Schleife ist die übergebene Variable %%i der Parameter %1
for %%i in (*.*) do call :loop "%%i"
goto ende
:loop
Set DateinameAlt=%~nx1
Set DateinameNeu=%DateinameAlt:~5,-1%
::5 Zeichen weg, weil jetzt der String-Inhalt von %DateiNameAlt% mit ["temp] beginnt; -1 = letztes " weg
ren %1 %Dateiname.neu .............(oder statt %1 auch %~f1 oder ähnlich)
goto :eof
:ende
Biber
In der :loop-Schleife ist die übergebene Variable %%i der Parameter %1
for %%i in (*.*) do call :loop "%%i"
goto ende
:loop
Set DateinameAlt=%~nx1
Set DateinameNeu=%DateinameAlt:~5,-1%
::5 Zeichen weg, weil jetzt der String-Inhalt von %DateiNameAlt% mit ["temp] beginnt; -1 = letztes " weg
ren %1 %Dateiname.neu .............(oder statt %1 auch %~f1 oder ähnlich)
goto :eof
:ende
Biber
War schon fast richtig...
In der :loop-Schleife ist die
übergebene Variable %%i der Parameter
%1
for %%i in (*.*) do call :loop
"%%i"
goto ende
:loop
Set DateinameAlt=%~nx1
Set DateinameNeu=%DateinameAlt:~5,1%
::5 Zeichen weg, weil jetzt der
Var-InhalteString mit ["temp] beginnt;
-1 = letztes " weg
ren %1 %Dateiname.neu .............(oder
statt %1 auch %~f1 oder ähnlich)
goto :eof
:ende
Biber
In der :loop-Schleife ist die
übergebene Variable %%i der Parameter
%1
for %%i in (*.*) do call :loop
"%%i"
goto ende
:loop
Set DateinameAlt=%~nx1
Set DateinameNeu=%DateinameAlt:~5,1%
::5 Zeichen weg, weil jetzt der
Var-InhalteString mit ["temp] beginnt;
-1 = letztes " weg
ren %1 %Dateiname.neu .............(oder
statt %1 auch %~f1 oder ähnlich)
goto :eof
:ende
Biber
Danke, so wie oben hat es auch funktioniert, aber egal.
Zweite Frage: Wie kann ich die ersten 4 Zeichen des Dateinamens auslesen?
Ich will jetzt nämlich noch eine Abfrage machen, ob der Dateiname überhaupt mit "temp" anfängt.
Antwort:
set prefix=%part1:~1,+4%
Gruß,
Maximilianus, ebenfalls in Bremen
Das Skript sollte bei Dateien, deren Name mit "temp" beginnt, diesen Anfang löschen. Dateien ohne vorangesetztes "temp" sollen unverändert bleiben.
So sieht dann der vollständige Quelltext aus:
setlocal
FOR %%i in (temp*.*) do call :loop "%%i"
goto FireAbend
:loop
set part1=%1
set prefix=%part1:~1,+4%
set part1=%part1:~5,-1%
@echo %1
@echo %part1%
ren %1 "%part1%"
goto :eof
:FireAbend
Endlocal
Danke für die Mithilfe,
Maximilianus
So sieht dann der vollständige Quelltext aus:
setlocal
FOR %%i in (temp*.*) do call :loop "%%i"
goto FireAbend
:loop
set part1=%1
set prefix=%part1:~1,+4%
set part1=%part1:~5,-1%
@echo %1
@echo %part1%
ren %1 "%part1%"
goto :eof
:FireAbend
Endlocal
Danke für die Mithilfe,
Maximilianus
Anmerkung: Statt zu prüfen, kannst du auch den Batch nur auf die
"temp*.*"-Dateien losjagen: statt "for %%i in (*.*) " nur
"for %%i in (temp*.*)"
Biber
"temp*.*"-Dateien losjagen: statt "for %%i in (*.*) " nur
"for %%i in (temp*.*)"
Biber
Sowas bescheuertes! So hatte ich auch angefangen mit dem Skript und dann flog es irgendwann raus.
Danke für den Hinweis, ist natürlich viel eleganter.
Maximilianus
@61595
Aber so haben es nun auch ein paar Mitleser verstanden mit den kryptischen %var:~1,-3%-Möglichkeiten, und dafür ist ja dieses Forum da.
Und endlich können wir auch die eigentliche Thread-Frage beantworten: Ja, Batchdateien können schon Dateinamen ändern... quod erat ja schließlich auch nur demonstrandum.
Aber so haben es nun auch ein paar Mitleser verstanden mit den kryptischen %var:~1,-3%-Möglichkeiten, und dafür ist ja dieses Forum da.
Und endlich können wir auch die eigentliche Thread-Frage beantworten: Ja, Batchdateien können schon Dateinamen ändern... quod erat ja schließlich auch nur demonstrandum.
Hallo,
ich habe ein ähnliches Problem, bin aber aus euren obigen Ausführungen nicht schlau geworden.
In einem Verzeichnis befinden sich mehrere Dateien mit unterschiedlichen Dateinamen und -endungen. Ich bräuchte eine batch-Datei, die an den bestehenden Dateinamen jeder einzelnen Datei das aktuelle Datum und die aktuelle Uhrzeit anhängt.
z.B.: testdatei.txt --> testdatei_20050831_h14m29s54.txt
Schon mal danke,
Gibbon
ich habe ein ähnliches Problem, bin aber aus euren obigen Ausführungen nicht schlau geworden.
In einem Verzeichnis befinden sich mehrere Dateien mit unterschiedlichen Dateinamen und -endungen. Ich bräuchte eine batch-Datei, die an den bestehenden Dateinamen jeder einzelnen Datei das aktuelle Datum und die aktuelle Uhrzeit anhängt.
z.B.: testdatei.txt --> testdatei_20050831_h14m29s54.txt
Schon mal danke,
Gibbon
Moin Gibbon,
Dein Problem läuft grade seit heute unter
... zumindest fast das gleiche. Lies bitte da mit, wenn Du dann meinst, Dein Prob ist ganz was anderes, mach bitte einen neuen Thread auf.
Dieser hier ist tot - den kennt keiner mehr außer mir *gg
Gibt auch noch ein paar ähnliche Fragen (mit Lösungsvorschlägen). Such mal im Forum nach "Datei Datum umbenennen Uhrzeit Zähler Batch" oder so.
Gruß
Frank / der Biber aus Bremen
Dein Problem läuft grade seit heute unter
... zumindest fast das gleiche. Lies bitte da mit, wenn Du dann meinst, Dein Prob ist ganz was anderes, mach bitte einen neuen Thread auf.
Dieser hier ist tot - den kennt keiner mehr außer mir *gg
Gibt auch noch ein paar ähnliche Fragen (mit Lösungsvorschlägen). Such mal im Forum nach "Datei Datum umbenennen Uhrzeit Zähler Batch" oder so.
Gruß
Frank / der Biber aus Bremen
Danke für die schnelle Antwort. Mittlerweile konnte ich das Problem selber lösen.
for /F "tokens=1,2,3 delims=. " %%a in ('date /t') do set TIMESTAMP=%%c%%b%%a
for /F "tokens=1,2,3,4 delims=:, " %%a in ('echo %TIME%') do set TIMESTAMP=%TIMESTAMP%_h%%am%%bs%%cms%%d
for /F "delims=. tokens=1,2" %%i in ('dir updateFiles\ /b') do ren updateFiles\%%i.%%j %%i_%TIMESTAMP%.%%j
for /F "tokens=1,2,3 delims=. " %%a in ('date /t') do set TIMESTAMP=%%c%%b%%a
for /F "tokens=1,2,3,4 delims=:, " %%a in ('echo %TIME%') do set TIMESTAMP=%TIMESTAMP%_h%%am%%bs%%cms%%d
for /F "delims=. tokens=1,2" %%i in ('dir updateFiles\ /b') do ren updateFiles\%%i.%%j %%i_%TIMESTAMP%.%%j