2012-04-18 9 views
11

Ich versuche, alle Dateinamen in einem aktuellen Ordner zu ändern, und ich versuche, dies entweder durch Entfernen der Dateipräfix (jede Datei hat ein gemeinsames Präfix) oder zu erreichen Ändern ihrer Namen in ihre Anzahl (wenn es 5 Dateien gibt, sind die Dateinamen 1.txt 2.txt 3.txt 4.txt 5.txt).Umbenennen (oder Entfernen von Präfix) mehrere Dateien zu jeder Nummer

Jetzt habe ich den Ren-Befehl in cmd gefunden und habe damit ein wenig gespielt aber bisher konnte ich das Ergebnis nicht erreichen und ich kann das nur in cmd ausführen, damit keine Batch-Dateien verwendet werden können.

Dies ist in der Nähe, die ich bekam, aber es fügt nur ein Präfix:

FOR %f IN (*.*) DO ren %f prefix%f 

ich das Gegenteil versucht haben zu tun:

FOR %f IN (*.*) DO ren prefix%f %f 

Aber natürlich habe ich nicht so funktionierten Ich bitte jetzt um Hilfe und eine Erklärung, wenn möglich (ich mag es zu verstehen, wie diese Dinge funktionieren). Vielen Dank im Voraus für jede Hilfe.

+0

Diese Befehle scheinen nicht einmal gut mit sehr großen Verzeichnissen zu funktionieren. Es fügt weiterhin Präfixen zu Dateien hinzu, denen bereits ein Präfix hinzugefügt wurde. – hnviet

Antwort

24

Ich verstehe nicht, warum Sie keine Batch-Datei verwenden können. Aber hier ist eine Lösung, die mit den meisten Dateinamen funktionieren sollte.

Kritisch - zuerst müssen Sie sicherstellen, dass Sie einen nicht definierten Variablennamen haben, werde ich verwenden fname

set "fname=" 

Als nächstes ist der Befehl, um tatsächlich die Umbenennung zu tun. Es wird nicht richtig funktionieren, wenn fname bereits definiert ist.

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%") 

Die fname Variable wird für jede Iteration definiert, und dann wird die Syntax %fname:*prefix=% ersetzt das erste Auftreten von „prefix“ mit nichts. Die heikle Sache ist Windows erste Versuche,% fname% zu erweitern, wenn der Befehl zuerst geparst wird. Das wird natürlich nicht funktionieren, weil es noch nicht definiert wurde. In der Befehlszeile werden die Prozentwerte beibehalten, wenn die Variable nicht gefunden wird. Der CALL verursacht eine zusätzliche Erweiterungsphase, die auftritt, nachdem die Variable festgelegt wurde, damit die Erweiterung funktioniert.

Wenn fname vor dem Ausführen des Befehls definiert ist, wird einfach versucht, die gleiche Datei für jede Iteration anstelle des Werts, der innerhalb der Schleife zugewiesen wird, umzubenennen.

Wenn Sie den Befehl erneut mit einem anderen Präfix ausführen möchten, müssen Sie die Definition zuerst erneut löschen.

EDIT - Hier ist eine Batch-Datei "RemovePrefix.bat" genannt, die den Job

::RemovePrefix.bat prefix fileMask 
@echo off 
setlocal 
for %%A in ("%~1%~2") do (
    set "fname=%%~A" 
    call ren "%%fname%%" "%%fname:*%~1=%%" 
) 

Sie Dateien wie "prefixName.txt" genannt hatte Angenommen, der Fall ist, dann würden Sie das Skript von

RemovePrefix "prefix" "*.txt" 
Ausführung

Die Stapeldatei wird Dateien in Ihrem aktuellen Verzeichnis umbenennen. Die Stapeldatei muss sich auch in Ihrem aktuellen Verzeichnis befinden, es sei denn, die Stapeldatei befindet sich in einem Verzeichnis, das sich in Ihrer PATH-Variablen befindet. Oder Sie können den vollständigen Pfad zur Stapeldatei angeben, wenn Sie sie aufrufen.

Die Regeln für die Erweiterung unterscheiden sich in einer Batch-Datei.FOR-Variablen müssen als %% A anstelle von% A referenziert werden, und %% fname %% wird nicht zuerst erweitert, stattdessen werden die doppelten Prozente in einzelne Prozente konvertiert und dann wird% fname% nach der CALL-Anweisung erweitert. Es spielt keine Rolle, ob fname bereits mit der Batch-Datei definiert ist. SETLOCAL macht die Definition von fname temporär (lokal) für die Batch-Datei.

+0

Perfekt, vielen Dank für die zusätzliche Erklärung! Edit: Könnten Sie, als Extra-Anfrage, ein Beispiel veröffentlichen, wenn es in einer Batch-Datei erstellt werden könnte? – Shadow

+0

Ich weiß nicht, wie es perfekt war - es gab einen bösen Fehler, bei dem% f mit% f in% fname% verwechselt wurde. Alles behoben jetzt :) – dbenham

+0

Welche Änderung muss ich in diesem Skript machen, so dass es nach '" .txt "' in jedem Child-Verzeichnis des aktuellen Verzeichnisses sucht und das gegebene 'Präfix' entfernt? – Kushal

23

Eine einfachere Lösung ist in
bereitgestellt https://superuser.com/a/871799/497147

ich es hier für einen leichteren Zugang kopiert.

Vergessen Sie komplizierte Skripte dafür.

rename ist ein sehr alter und nie richtig abgeschlossener Befehl. Wenn Sie es nicht richtig verwenden, könnte das Ergebnis Sie überraschen.

Zum Beispiel ein Präfix abcd von abcd1.txt, abcd2.txt, abcd3.txt usw. zu entfernen, um zu bekommen 1.txt, 2.txt verwenden 3.txt einfach

rename "abcd*.txt" "////*.txt" 

Sie müssen die gleiche Anzahl von / wie die Anzahl der Anfangszeichen Sie möchten entfernen.

Setzen Sie doppelte Anführungszeichen für beide Argumente.

+0

Retter des Tages hinzufügen. –

+0

Sehr cool und bizarre Technik. Ich habe meine [Wie funktioniert das Windows RENAME-Kommando Wildcards interpretieren?] (Https://superuser.com/q/475874/109090) SuperUser Q & A mit dieser Information, obwohl das '/' nicht als wild funktioniert Karte. – dbenham

+0

Unglaublich einfach und perfekt funktionierend. Beachten Sie, dass sich die Anzahl von "/" nicht darauf bezieht, wie viele Zeichen in einem übereinstimmenden Ausdruck angegeben sind. Ein anderes Beispiel: "rename" IM *. * "" ////**** "' passt zu einem 2-Char-Präfix und löscht 4 Zeichen – PaoloC