Diese Regeln wurden nach umfangreichen Tests auf einem Vista-Computer entdeckt. Es wurden keine Tests mit Unicode in Dateinamen durchgeführt.
RENAME erfordert 2 Parameter - eine Quellmaske, gefolgt von einer Zielmaske. Sowohl die Quellmaske als auch die Zielmaske können Platzhalter *
und / oder ?
Platzhalter enthalten. Das Verhalten der Platzhalter ändert sich geringfügig zwischen Quell- und Zielmaske.
Hinweis - REN kann zum Umbenennen eines Ordners verwendet werden. Beim Umbenennen eines Ordners sind jedoch weder in der Quellmaske noch in der Zielmaske Platzhalter zulässig. Wenn die Quellmaske mindestens einer Datei entspricht, werden die Dateien umbenannt und Ordner ignoriert. Wenn die Quellmaske nur mit Ordnern und nicht mit Dateien übereinstimmt, wird ein Syntaxfehler generiert, wenn in der Quelle oder im Ziel Platzhalter angezeigt werden. Wenn die Quellmaske mit nichts übereinstimmt, wird der Fehler "Datei nicht gefunden" ausgegeben.
Beim Umbenennen von Dateien sind Platzhalter nur im Dateinamensbereich der Quellmaske zulässig. Platzhalter sind im Pfad zum Dateinamen nicht zulässig.
sourceMask
Die Quellmaske dient als Filter, um zu bestimmen, welche Dateien umbenannt werden. Die Platzhalter funktionieren hier genauso wie bei jedem anderen Befehl, der Dateinamen filtert.
?
- Stimmt mit einem beliebigen 0- oder 1-Zeichen überein, mit Ausnahme von .
Dieses Platzhalterzeichen ist gierig. Wenn es kein Zeichen ist, wird immer das nächste Zeichen verwendet.
.
*
- Stimmt mit 0 oder mehr Zeichen überein .
(mit einer Ausnahme unten). Diese Wildcard ist nicht gierig. Es stimmt so wenig oder so viel überein, wie erforderlich ist, damit nachfolgende Zeichen übereinstimmen.
Alle Zeichen, die keine Platzhalterzeichen sind, müssen mit Ausnahme einiger Ausnahmen für Sonderfälle übereinstimmen.
.
- Stimmt mit sich selbst überein oder es kann mit dem Ende des Namens (nichts) übereinstimmen, wenn keine weiteren Zeichen verbleiben. (Hinweis - Ein gültiger Windows-Name darf nicht mit enden. .
)
{space}
- Stimmt mit sich selbst überein oder es kann mit dem Ende des Namens (nichts) übereinstimmen, wenn keine weiteren Zeichen verbleiben. (Hinweis - Ein gültiger Windows-Name darf nicht mit enden. {space}
)
*.
am Ende - Spiele alle 0 oder mehr Zeichen außer .
dem Abschluss .
tatsächlich ein beliebige Kombination sein können , .
und {space}
solange das allerletzte Zeichen in der Maske .
Dies ist die einzige Ausnahme , wo *
einfach keine Gruppe von Zeichen entsprechen.
Die obigen Regeln sind nicht so komplex. Es gibt jedoch eine weitere sehr wichtige Regel, die die Situation verwirrt: Die Quellmaske wird sowohl mit dem langen Namen als auch mit dem kurzen 8.3-Namen (sofern vorhanden) verglichen. Diese letzte Regel kann die Interpretation der Ergebnisse sehr schwierig machen, da es nicht immer offensichtlich ist, wann die Maske über den Kurznamen übereinstimmt.
Mit RegEdit können Sie die Generierung kurzer 8.3-Namen auf NTFS-Volumes deaktivieren. In diesem Fall ist die Interpretation der Dateimaskenergebnisse viel einfacher. Alle Kurznamen, die vor dem Deaktivieren der Kurznamen generiert wurden, bleiben erhalten.
targetMask
Hinweis - Ich habe keine strengen Tests durchgeführt, aber es scheint, dass dieselben Regeln auch für den Zielnamen des Befehls COPY gelten
Die targetMask gibt den neuen Namen an. Es wird immer auf den vollständigen Langnamen angewendet. Die Zielmaske wird niemals auf den kurzen 8.3-Namen angewendet, selbst wenn die Quellmaske mit dem kurzen 8.3-Namen übereinstimmt.
Das Vorhandensein oder Fehlen von Platzhaltern in der Quellmaske hat keinen Einfluss darauf, wie Platzhalter in der Zielmaske verarbeitet werden.
In der folgenden Diskussion - c
stellt jedes Zeichen , das nicht *
, ?
oder.
Die Zielmaske wird ausschließlich von links nach rechts ohne Rückverfolgung anhand des Quellennamens verarbeitet.
c
- Verschiebt die Position innerhalb des Quellennamens, solange das nächste Zeichen nicht vorhanden ist, .
und wird c
an den Zielnamen angehängt . (Ersetzt das Zeichen, das in der Quelle enthalten war c
, aber niemals ersetzt .
)
?
- Stimmt mit dem nächsten Zeichen des Quell-Langnamens überein und hängt es an den Zielnamen an, solange das nächste Zeichen nicht ist. .
Wenn das nächste Zeichen .
oder das Ende des Quellnamens ist, wird dem Ergebnis und dem aktuellen kein Zeichen hinzugefügt Die Position innerhalb des Quellennamens bleibt unverändert.
*
am Ende von targetMask - Hängt alle verbleibenden Zeichen von der Quelle an das Ziel an. Wenn schon am Ende der Quelle, dann nichts.
*c
- Ordnet alle Quellzeichen von der aktuellen Position bis zum letzten Auftreten von c
(case sensitive gierige Übereinstimmung) zu und hängt den übereinstimmenden Zeichensatz an den Zielnamen an. Wird dies c
nicht gefunden, werden alle verbleibenden Zeichen aus der Quelle angehängt. c
Dies ist die einzige mir bekannte Situation, in der bei der Windows-Dateimustererkennung zwischen Groß- und Kleinschreibung unterschieden wird.
*.
- Stimmt mit allen Quellzeichen von der aktuellen Position bis zum letzten Auftreten von .
(gierige Übereinstimmung) überein und fügt den übereinstimmenden Zeichensatz an den Zielnamen an. Wird dies .
nicht gefunden, werden alle verbleibenden Zeichen aus der Quelle angehängt, gefolgt von.
*?
- Hängt alle verbleibenden Zeichen von der Quelle an das Ziel an. Wenn schon am Ende der Quelle dann nichts.
.
without *
in front - Verschiebt die Position in der Quelle durch das erste Vorkommen, .
ohne Zeichen zu kopieren, und hängt sie .
an den Zielnamen an. Wird .
es in der Quelle nicht gefunden, wird zum Ende der Quelle weitergeschaltet und .
an den Zielnamen angehängt .
Nachdem die targetMask erschöpft ist, werden alle nachfolgenden .
und {space}
abgeschnittenen Einträge am Ende des resultierenden Zielnamens angezeigt, da Windows-Dateinamen nicht mit .
oder enden können{space}
Einige praktische Beispiele
Ersetzen Sie ein Zeichen an der ersten und dritten Stelle vor einer Erweiterung (fügt ein zweites oder drittes Zeichen hinzu, falls es noch nicht vorhanden ist)
ren * A?Z*
1 -> AZ
12 -> A2Z
1.txt -> AZ.txt
12.txt -> A2Z.txt
123 -> A2Z
123.txt -> A2Z.txt
1234 -> A2Z4
1234.txt -> A2Z4.txt
Ändern Sie die (endgültige) Erweiterung jeder Datei
ren * *.txt
a -> a.txt
b.dat -> b.txt
c.x.y -> c.x.txt
Fügen Sie an jede Datei eine Erweiterung an
ren * *?.bak
a -> a.bak
b.dat -> b.dat.bak
c.x.y -> c.x.y.bak
Entfernen Sie alle zusätzlichen Erweiterungen nach der anfänglichen Erweiterung. Beachten Sie, dass ausreichend ?
verwendet werden muss, um den vollständigen vorhandenen Namen und die ursprüngliche Erweiterung beizubehalten.
ren * ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 -> 12345.12345 (note truncated name and extension because not enough `?` were used)
Wie oben, jedoch werden Dateien mit einem Anfangsnamen und / oder einer Erweiterung von mehr als 5 Zeichen herausgefiltert, damit sie nicht abgeschnitten werden. (Offensichtlich könnte ?
an beiden Enden der Zielmaske eine zusätzliche hinzugefügt werden, um Namen und Erweiterungen mit bis zu 6 Zeichen Länge beizubehalten.)
ren ?????.?????.* ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 (Not renamed because doesn't match sourceMask)
Ändern Sie die Zeichen nach dem Nachnamen _
und versuchen Sie, die Erweiterung beizubehalten. (Funktioniert nicht richtig, wenn _
in der Erweiterung angezeigt wird)
ren *_* *_NEW.*
abcd_12345.txt -> abcd_NEW.txt
abc_newt_1.dat -> abc_newt_NEW.dat
abcdef.jpg (Not renamed because doesn't match sourceMask)
abcd_123.a_b -> abcd_123.a_NEW (not desired, but no simple RENAME form will work in this case)
Jeder Name kann in Komponenten unterteilt werden, die durch .
Zeichen begrenzt sind. Diese dürfen nur am Ende jeder Komponente angehängt oder gelöscht werden. Zeichen können nicht am Anfang oder in der Mitte einer Komponente gelöscht oder hinzugefügt werden, während der Rest mit Platzhaltern beibehalten wird. Ersetzungen sind überall erlaubt.
ren ??????.??????.?????? ?x.????999.*rForTheCourse
part1.part2 -> px.part999.rForTheCourse
part1.part2.part3 -> px.part999.parForTheCourse
part1.part2.part3.part4 (Not renamed because doesn't match sourceMask)
a.b.c -> ax.b999.crForTheCourse
a.b.CarPart3BEER -> ax.b999.CarParForTheCourse
Wenn Kurznamen aktiviert sind, stimmt eine Quellmaske mit mindestens 8 ?
für den Namen und mindestens 3 ?
für die Erweiterung mit allen Dateien überein, da sie immer mit dem Kurznamen 8.3 übereinstimmt.
ren ????????.??? ?x.????999.*rForTheCourse
part1.part2.part3.part4 -> px.part999.part3.parForTheCourse
Nützliche Eigenart / Fehler? zum Löschen von Namenspräfixen
In diesem SuperUser-Beitrag wird beschrieben, wie mit einer Reihe von Schrägstrichen ( /
) führende Zeichen aus einem Dateinamen gelöscht werden können. Für jedes zu löschende Zeichen ist ein Schrägstrich erforderlich. Ich habe das Verhalten auf einem Windows 10-Computer bestätigt.
ren "abc-*.txt" "////*.txt"
abc-123.txt --> 123.txt
abc-HelloWorld.txt --> HelloWorld.txt
Diese Technik funktioniert nur, wenn sowohl die Quell- als auch die Zielmaske in doppelte Anführungszeichen eingeschlossen sind. Alle folgenden Formulare ohne die erforderlichen Anführungszeichen schlagen mit diesem Fehler fehl:The syntax of the command is incorrect
REM - All of these forms fail with a syntax error.
ren abc-*.txt "////*.txt"
ren "abc-*.txt" ////*.txt
ren abc-*.txt ////*.txt
Mit dem /
können keine Zeichen in der Mitte oder am Ende eines Dateinamens entfernt werden. Es können nur führende (Präfix-) Zeichen entfernt werden.
Technisch /
funktioniert das nicht als Wildcard. Vielmehr handelt es sich um eine einfache Zeichenersetzung. Nach der Ersetzung erkennt der Befehl REN jedoch, dass /
ein Dateiname ungültig ist, und entfernt die führenden /
Schrägstriche aus dem Namen. REN gibt einen Syntaxfehler aus, wenn er /
in der Mitte eines Zielnamens erkannt wird.
Möglicher RENAME-Fehler - Ein einzelner Befehl kann dieselbe Datei zweimal umbenennen!
In einem leeren Testordner starten:
C:\test>copy nul 123456789.123
1 file(s) copied.
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 123456~1.123 123456789.123
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
C:\test>ren *1* 2*3.?x
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 223456~1.XX 223456789.123.xx
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
REM Expected result = 223456789.123.x
Ich glaube, die Quellmaske stimmt *1*
zuerst mit dem langen Dateinamen überein und die Datei wird in das erwartete Ergebnis von umbenannt 223456789.123.x
. RENAME sucht dann weiter nach weiteren zu verarbeitenden Dateien und findet die neu benannte Datei über den neuen Kurznamen von 223456~1.X
. Die Datei wird dann erneut umbenannt, was das Endergebnis von ergibt 223456789.123.xx
.
Wenn ich die 8.3-Namensgenerierung deaktiviere, gibt der RENAME das erwartete Ergebnis aus.
Ich habe nicht alle Auslösebedingungen ausgearbeitet, die vorliegen müssen, um dieses merkwürdige Verhalten hervorzurufen. Ich befürchtete, dass es möglich sein könnte, einen nie endenden rekursiven RENAME zu erstellen, aber ich war nie in der Lage, einen zu induzieren.
Ich glaube, all das Folgende muss stimmen, um den Fehler auszulösen. Jeder fehlerhafte Fall, den ich sah, hatte die folgenden Bedingungen, aber nicht alle Fälle, die die folgenden Bedingungen erfüllten, waren fehlerhaft.
- Kurze 8.3-Namen müssen aktiviert sein
- Die Quellmaske muss mit dem ursprünglichen Langnamen übereinstimmen.
- Die anfängliche Umbenennung muss einen Kurznamen generieren, der auch mit der Quellmaske übereinstimmt
- Der ursprüngliche umbenannte Kurzname muss später als der ursprüngliche Kurzname sortiert werden (falls vorhanden?)