Wie interpretiert der Windows-Befehl RENAME (REN) Platzhalter?
Die eingebaute HELP-Funktion hilft nicht weiter - sie spricht überhaupt keine Platzhalter an.
Die Microsoft Technet XP Online-Hilfe ist nicht viel besser. Hier ist alles, was es zu Platzhaltern zu sagen hat:
"Sie können in jedem Dateinamenparameter Platzhalter (
*
und?
) verwenden. Wenn Sie Platzhalter in Dateiname2 verwenden, stimmen die durch die Platzhalter dargestellten Zeichen mit den entsprechenden Zeichen in Dateiname1 überein."
Keine große Hilfe - es gibt viele Möglichkeiten, wie Aussagen interpretiert werden können.
Ich habe es manchmal geschafft, Platzhalter im Parameter " filename2" erfolgreich zu verwenden , aber es war immer ein Versuch und Irrtum. Ich konnte nicht vorhersehen, was funktioniert und was nicht. Häufig musste ich ein kleines Stapelskript mit einer FOR-Schleife schreiben, die jeden Namen analysiert, damit ich jeden neuen Namen nach Bedarf erstellen kann. Nicht sehr praktisch.
Wenn ich die Regeln für die Verarbeitung von Platzhaltern kennen würde, könnte ich den Befehl RENAME effektiver verwenden, ohne so oft auf Batches zurückgreifen zu müssen. Die Kenntnis der Regeln würde natürlich auch der Chargenentwicklung zugute kommen.
(Ja - dies ist ein Fall, in dem ich eine gepaarte Frage und Antwort poste. Ich hatte es satt, die Regeln nicht zu kennen, und entschied mich, alleine zu experimentieren. Ich glaube, viele andere interessieren sich vielleicht für das, was ich entdeckt habe.)
quelle
*
Windows dies tut. Das hat enorme Konsequenzen. Ich wünschte, ich hätte etwas über diese Seite gewusst. es hätte meine Untersuchung erleichtern können. Die MSDOS7-Regeln unterscheiden sich erheblich von den alten DOS-Regeln vor langen Dateinamen und sind ein Schritt in die Richtung, wie Windows damit umgeht. Ich hatte die DOS-Regeln für vorlange Dateinamen gefunden und sie waren für meine Untersuchung wertlos.Antworten:
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 wirdc
an den Zielnamen angehängt . (Ersetzt das Zeichen, das in der Quelle enthalten warc
, 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 vonc
(case sensitive gierige Übereinstimmung) zu und hängt den übereinstimmenden Zeichensatz an den Zielnamen an. Wird diesc
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)
Ändern Sie die (endgültige) Erweiterung jeder Datei
Fügen Sie an jede Datei eine Erweiterung an
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.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.)Ändern Sie die Zeichen nach dem Nachnamen
_
und versuchen Sie, die Erweiterung beizubehalten. (Funktioniert nicht richtig, wenn_
in der Erweiterung angezeigt wird)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.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.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.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
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:
Ich glaube, die Quellmaske stimmt
*1*
zuerst mit dem langen Dateinamen überein und die Datei wird in das erwartete Ergebnis von umbenannt223456789.123.x
. RENAME sucht dann weiter nach weiteren zu verarbeitenden Dateien und findet die neu benannte Datei über den neuen Kurznamen von223456~1.X
. Die Datei wird dann erneut umbenannt, was das Endergebnis von ergibt223456789.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.
quelle
REN /?
.Copy of
Präfix tatsächlich mit einem dunklen Schrägstrich löschen :ren "Copy of *.txt" "////////*"
Ähnlich wie bei exebook gibt es hier eine C # -Implementierung, um den Zieldateinamen aus einer Quelldatei abzurufen.
In dbenhams Beispielen habe ich 1 kleinen Fehler gefunden:
Hier ist der Code:
Und hier ist eine NUnit-Testmethode zum Testen der Beispiele:
quelle
Vielleicht kann jemand dies nützlich finden. Dieser JavaScript-Code basiert auf der Antwort von dbenham oben.
Ich habe nicht
sourceMask
viel getestet , aber estargetMask
passt zu allen Beispielen von dbenham.quelle
Ich habe es geschafft, diesen Code in BASIC zu schreiben, um Platzhalter-Dateinamen zu maskieren:
quelle