2016-07-31 16 views
0

Ich habe mehrere hundert Dateien auf eine bestimmte Weise benannt, die umbenannt werden müssen, indem Sie das 13-15. Zeichen je nachdem, was das sechste Zeichen ist, ersetzen. Ich war nicht in der Lage, etwas zu erstellen, das den 6. Charakter lesen wird, aber lasse es in Ruhe und ändere nur die 13-15.Windows-Batch-Datei zum bedingten Umbenennen machen

Die Dateien haben das folgende Format.

2016-A124578_XYZ_moretext.ext 
2016-B345654_XYZ_morerandomtext.ext 
2016-B235689_XYZ_moredifferenttext.ext 
2016-A789945_XYZ_moretext.ext 
2016-C547821_XYZ_moretext.ext 

Das Skript muss das 6. Zeichen (A, B oder C) und ersetzen Sie die XYZ mit AAA oder BBB oder CCC in Abhängigkeit von dem Brief lesen. Der Rest des Dateinamens muss identisch sein.

2016-A124578_XYZ_moretext.ext becomes 2016-A124578_AAA_moretext.ext 
2016-B345654_XYZ_morerandomtext.ext becomes 2016-B345654_BBB_morerandomtext.ext 

Ist es möglich, diese Art von Skript zu machen? Würde RegEx der beste Weg sein, es zu versuchen?

+0

Wenn Sie noch nicht wissen, wie Batch-Dateien zu schreiben, selbst einen Gefallen tun und lernen Powershell stattdessen. Etwas zu tun, was im Batch etwas kompliziert ist, ist * schmerzhaft *. Je früher jeder vergisst, desto besser. Powershell ist so viel besser, und es ist auf modernen Windows-Systemen vorinstalliert. Es unterstützt auch Regex - Batch nicht. – Blorgbeard

+0

PowerShell ist unnötig ausführlich und ist nicht standardmäßig aktiviert. Wenn Sie nicht einen Tipp-Fetisch haben, bleiben Sie bei Batch. – SomethingDark

+0

Es ist nicht die beste Sprache da draußen, aber wenn Sie versuchen, tatsächliche Programme zu schreiben, ohne etwas Neues zu installieren, ist es Powershell oder Batch. Batch ist ein schrecklicher Haufen von rückwärtskompatiblen Hacks auf dem Hack, und die Syntax spiegelt das wider. Powershell ist manchmal sehr ausführlich, aber es gibt viele IDEs mit Autovervollständigung dafür. Batch ist in Ordnung für einfache Listen von Befehlen. Alles komplizierter und es ist einfach schrecklich. Meiner Meinung nach. – Blorgbeard

Antwort

1
Set Str=2016-B345654_XYZ_morerandomtext.ext 
Echo %str% %str:~0,13% %str:~5,1%%str:~5,1%%str:~5,1% %str:~16% 

Ich habe Leerzeichen eingefügt, um zu zeigen, welcher Teil was macht, entferne sie.

Siehe set /? für Hilfe.

1

Ich fand einen weit einfacheren Weg, dies zu erreichen, da das Format der Dateien immer so sein würde, wie ich oben angegeben habe.

Einfach dies in einer Batch-Datei verwendet, ...

REN 2016-A*.ext 2016-A??????_AAA_*.ext 
REN 2016-B*.ext 2016-B??????_BBB_*.ext 
REN 2016-C*.ext 2016-C??????_CCC_*.ext 
+0

+1, aber ich kann das noch weiter vereinfachen. Außerdem gibt es Möglichkeiten, weniger Annahmen zu machen, die immer noch ziemlich einfach sind. Siehe [meine Antwort] (http://stackoverflow.com/a/38690293/1012053). – dbenham

0

noch einfacher :-)

for %A in (A B C) @do ren 2016-%A*.ext *_%A%A%A* 

Wenn aus einer Batch-Datei ausführen, dann verdoppelt sich die Prozent:

@for %%A in (A B C) @do ren 2016-%%A*.ext *_%%A%%A%%A* 

Informationen dazu, warum dieser RENAME funktioniert, finden Sie unter How does the Windows RENAME command interpret wildcards?.

Der Code geht jedoch davon aus, dass alle Dateien im Ordner dem Muster folgen. Was passiert, wenn Dateien vorhanden sind, die nicht mit dem Muster übereinstimmen, das nicht umbenannt werden sollte? Der simple Filter birgt das Risiko, Dateien umzubenennen, die nicht umbenannt werden sollten.

Sie könnte mit der Quelle Maske etwas genauer sein:

for %A in (A B C) @do ren 2016-%A??????_XYZ_*.ext *_%A%A%A* 

Aber es gibt noch zwei mögliche Probleme:

  • ? Matches 0 oder 1 Zeichen, so dass es dort nicht gewährleistet sein mehr als 6 Zeichen, aber es könnte weniger als 6 sein
  • ? passt ein beliebiges Zeichen, nicht nur Ziffern.

Sie könnten DIR/B mit FINDSTR gekoppelt verwenden sehr spezifisch sein:

for %A in (A B C) @do for %F in (dir /b /a-d 2016-%A*.ext^|findstr /ric:"2016-%A[0-9][0-9][0-9][0-9][0-9][0-9]_XYZ_*\.ext"') do ren "%F" *_%A%A%A* 

Aber es gibt eine andere Lösung, die sowohl einfach und präzise ist - a regular expression rename utility called JREN.BAT.Es ist ein reines Skript (hybrid batch/JScript), das nativ auf jedem Windows-Rechner ausgeführt werden kann, ohne dass exe-Dateien von Drittanbietern benötigt werden.

jren "^(2016-([ABC])\d{6}_)XYZ(_.*\.ext)$" "$1$2$2$2$3" /i 
0

Dieses ist ein bisschen ausführlicher, aber ich finde es einfacher zu lesen und ändern:

@Echo off 
setlocal enabledelayedexpansion 
for /f %%f in ('dir *.ext /b') do (
    set fName=%%f 
    set fTag=!fName:~5,1! 
    set fPrefix=!fName:~0,13! 
    set fSuffix=!fName:~16! 
    set fReplace=!fName:~13,3! 
    if /i "!fTag!" EQU "A" set fReplace=AAA 
    if /i "!fTag!" EQU "B" set fReplace=BBB 
    if /i "!fTag!" EQU "C" set fReplace=CCC 

    ren !fName! !fPrefix!!fReplace!!fSuffix! 
) 
Verwandte Themen