Dateien umbenennen / bestimmte Stellen

dinoldo

Cadet 4th Year
Registriert
Juni 2017
Beiträge
104
Hallo Leute,

ich habe im Verzeichnis "T:\Lösche GmbH\" die PDF-Dateien liegen:

T:\Lösche GmbH\5_HKL_004_U1_40204_-HF.pdf
T:\Lösche GmbH\5_HKL_000_U2_40100_-HF.pdf
T:\Lösche GmbH\5_HKL_001_U1_40201_-HF.pdf
T:\Lösche GmbH\5_HKL_001_U2_40101_-HF.pdf
T:\Lösche GmbH\5_HKL_002_U1_40202_-HF.pdf
T:\Lösche GmbH\5_HKL_002_U2_40102_-HF.pdf
T:\Lösche GmbH\5_HKL_003_U1_40203_-HF.pdf
T:\Lösche GmbH\5_HKL_003_U2_40103_-HF.pdf

bei den ich beispielsweise an der 5, 8 und 10 Stelle die Zeichen durch # per Batch ersetzen möchte.

Ich habe mir im Verzeichnis ein CMD-Datei abgelegt, die folgenden Inhalt hat:

PowerShell:
@echo off
chcp 1252
cls
color 9f

echo.
echo [1] ja - Dateien werden umbenannt
echo [2] nein - Dateien werden umbenannt
echo.

set frage=1
set /P frage=Bitte die Nummer eingeben (Enter = 1):
IF %frage% == 1 (
    ren *.pdf ????#??#?#*.pdf
)
IF %frage% == 2 (
    echo ""
)


Das funktioniert sehr gut, weil ich an Stellen 5, 8 und 10 fest das Zeichen # eingetragen habe.

Wie kann ich bitte Code so erweitern, dass ich gefragt werde, welche Stellen in Dateiname durch # ersetzt werden sollen?
Ich stellen mir ein Eintrag wie folgt vor: 5,8,10
Damit wäre ich flexibel und könnte die Stellen per Eingabe festlegen.

Geht das überhaupt?

Vielen Dank im Voraus!

Beste Grüße,
Dino
 
Du könntest mit den Befehlen CHOICE bzw ERRORLEVEL arbeiten. Näheres erfährst Du wenn eine Eingabeaufforderung startest, und den Befehl "Choice /?" eingibst. Ein Beispiel einer Ja / Nein / Abbruch Abfrage ist in der Hilfe enthalten.

Anschließend wertest Du die Systemvariable %ERRORLEVEL aus, und verzweigst dann mit Hilfe des GOTO-Befehls und entsprechenden Sprungmarken.
 
  • Gefällt mir
Reaktionen: new Account()
Hallo Digi Quichotte,

ich kann dich nicht folgen. :-) Ich versuche es nochmals zu lesen.
Wie werte ich die Systemvariable %ERRORLEVEL bitte aus?
 
Choice ist eine vereinfachte Input-Abfrage. Mit z.B.

Choice /C JNA /M "Soll die Datei gelöscht werden (J=Ja N=Nein A=Abbruch)"

wird Dir eine Abfrage angezeigt. Der Parameter /C bestimmt die Tasten die als gültige Antwort von der abfrage akzeptiert werden - im vorliegenden Beispiel J,N und A. Alle anderen Tastendrücke (außer STRG-C) werden ignoriert. Der Parameter /M legt (innerhalb der Anführungszeichen) die Meldung fest die angezeigt werden soll.

Wenn das Programm die Zeile erreicht pausiert es und wartet auf eine gültige Eingabe (s.o.). Erfolgt diese wird das Ergebnis der Auswahl in der Systemvariable %ERRORLEVEL gespeichert. Und zwar in einer Zahl die abhängig von der Position des Zeichens im Parameter /C ist. Drückt man also bei obigem Beispiel auf J dann ist %ERRORLEVEL=1, drückt man N dann ist %ERRORLEVEL=2 bei A ist %ERRORLEVEL=3, usw. Definiert man keinen /C Parameter hat man nur 1 oder 2 als Antwort in %ERRORLEVEL.

Nun wertest Du im Folgeschritt die Variable %ERRORLEVEL mit IF und GOTO aus.

If %ERRORLEVEL==1 GOTO LOESCHEN
...
...
:LOESCHEN
(Das ist eine Sprungmarke zu der man mit GOTO verzweigt)
DEL [Pfadnamen]

Ich hoffe Du kannst das jetzt besser nachvollziehen.
 
Hallo Znep,

danke für deine Nachricht. Ich muss in eine bestehende Batch-Datei das Ganze implementieren.

Grüße,
Dino
Ergänzung ()

Hallo Digi Quichotte,

sorry, aber irgendwie passt dein Antwort auf meiner Frage nicht.

Ich möchte in einer Batch-Datei eintragen welche Stellen (Abfrage - dann eingabe z.B. 5,8,10) in der Dateinamen durch das Zeichen # ersetzt werden sollen. Vielleicht geht das gar nicht per Batch.

Grüße,
Dino
 
Zuerstmal: Batch ist für Stringoperationen denkbar schlecht. Wenn Du auf was anderes ausweichen kannst: Tu das.

Ansonsten kann der SET-Befehl eine ganze Menge Transformationen, die bei der Zuweisung erledigt werden.

Und da das Ganze variabel sein muß, wirst Du am Anfang der Batchdatei SETLOCAL ENABLEDELAYEDEXPANSION angeben müssen, damit es funktioniert.

Wenn ich mir das so anschau mit der Auswahl der "Ersetzungspositionen", dann kann das ja auch nochmal variabel in der Anzahl werden (Stellen 1,4 oder Stellen 4,2,8 oder Stellen 3,5,8,10). Das heißt Schleife und es wird langsam umständlich.

Du müßtest entsprechend hergehen und:
-- Einen Positionsindex definieren. Der ist zu Beginn immer erstmal 0.
-- Einen Zielstring definieren. Der ist zu Beginn immer erstmal leer.
-- Die angegebene Liste von Positionen in Einzelwerte aufsplitten (for /f tokens= ...)
-- Für jeden dieser Einzelwerte einen Substring mit SET erstellen von Positionsindex bis Einzelwert - 1 und das an den Zielstring anhängen.
-- Dann das Ersatzzeichen, zB #, an den Zielstring anhängen
-- und den Positionsindex auf den aktuellen betrachteten Einzelwert setzen.
-- Dann den nächsten Einzelwert anschauen.
-- Gibts keine weiteren Einzelwerte mehr, die Erweiterung anhängen, zB .pdf, kann man aber mit dem Modifikator ~x vom Quelldateinamen ableiten (erfordert aber zwingend eine Schleife drumherum, die einmal zu durchlaufen ist); sinngemäß:
for %%n in (dateiname.pdf) do echo %%~xn
"dateiname.pdf" als solches muß nicht als Datei existieren, das ist einfache Stringmanipulation (~x liefert alles vom letzten Punkt bis Ende der Zeichenfolge).

Und das was DA rauskommt, ist der neue Name für die jeweilige Datei und kann somit als zweiter Parameter für ein copy, move, rename oder sonstwas verwendet werden.

Protip:
SET erhält Anführungszeichen: SET variable=text und SET variable="text" sind NICHT identisch.
Daher bei Zuweisungen auf zusätzliche Anführungszeichen verzichten. Der Modifikator ~ innerhalb von Schleifen (ohne weiteren Buchstaben) schmeißt umgebende Anführungszeichen aus Zeichenfolgen raus.

Das wird spätestens dann wichtig, wenn es Dateinamen mit Leerzeichen gibt und das Ergebnis an den ausführenden Befehl übergeben werden muß -- dann müssen nämlich Anführungszeichen um den zweiten Parameter, sonst wird es kein "zweiter", sondern irgendwas von zweiter bis n-ter. Ist der übergebene String bereits von Anführungszeichen umgeben, wird die Datei nicht gefunden und/oder der Versuch geht einfach schief, da (doppelte) Anführungszeichen nicht Teil eines Dateinamens in NTFS sein dürfen.


Außerdem kannst Du ggfs. "Hilfs-Batchdateien" erstellen und die per CALL aufrufen. Auf diesem Weg kann zB eine zweite Batchdatei dynamisch generiert und dort alle RENAME-Befehle reingeschrieben werden, die man braucht. Diese Datei kann man dann mit Scriptabschluß ausführen (und hinterher löschen) lassen.

"Pro"-Protip:
Wenn Du's Dir zutraust und Du die Möglichkeit hast:
-- SED für Windows beschaffen (oder via cygwin, oder via msys2). Das ist ein **S**treaming **Ed**itor (daher der Name) der reguläre Ausdrücke versteht und der weitreichende Editierfunktionen unterstützt. Es gibt faktisch nichts, was man mit SED nicht machen könnte, soweit es was mit Text zu tun hat.
-- In die SED-Dokumentation einlesen.
Mit SED wird das gewünschte Unterfangen vielleicht nicht zu einem Einzeiler, aber es wird signifikant kürzer (es würde natürlich nur die Erstellung des Zieldateinamens übernehmen können, der Rest müßte weiterhin als Batch oder sonst einer Sprache erhalten bleiben).


Hilfe zu den Möglichkeiten von SET gibts mit HELP SET, für FOR entsprechend mit HELP FOR.
 
Zurück
Oben