2016-07-12 23 views
3

Ich versuche, alle Dateien aufzulisten, die nach der Erweiterung zusätzliche Suffix haben ZB: .txt.1 oder .txt.2 etc ..Dateien mit zusätzlichen Suffix in Batch

Ich verwende txt . aber es gibt alle Dateinamen anstatt nur die Dateien mit zusätzlichen Suffix

for %%A in (*txt.*) do (call :renum "%%A") 

danach ich mein Programm ich schreibe die Dateien entsprechend umbenennen. Kann jemand bitte überprüfen und helfen.

+0

Das Muster sollte 'lesen * .txt. *' (notieren Sie den hinzugefügten Punkt) ... – aschipfl

+0

@aschipfl: Haben Sie versucht, was passiert, wenn Sie das tun? – zb226

+0

versucht, dass bereits, aber es hat nicht funktioniert – Bharath

Antwort

2

Eine Lösung wäre durch die Erweiterung innerhalb der Schleife zum Filtern sein:

FOR %%A IN (*txt.*) DO (
    IF NOT "%%~xA"==".txt" CALL :renum "%%A" 
) 

Dies funktioniert, indem die "enhanced variable Substitution von FOR references" verwendet wird, in diesem Fall %%~xA. Sie können einen Überblick über alle verfügbaren Vertretungen erhalten, indem Sie FOR /? ausführen.

Update:

  • Diese Lösung nicht zwischen Groß- und unsensibel funktioniert, denn das war weder ausdrücklich gefordert oder verboten ist. Verwenden Sie IF /I anstelle von IF, wenn die Groß-/Kleinschreibung beachtet werden soll.
  • Als dbenham Hinweise geben es Fälle, Rand:
    • name.txt.txtnicht verarbeitet werden. Wenn das in Ordnung ist, ist das nicht klar gesagt, aber eher wahrscheinlich.
    • name_txt.extwird verarbeitet werden, was *txt.* den gegebenen Wildcard fällig und kann mit *.txt.* statt vermieden werden. Mein Grund, es nicht von vornherein zu ändern, war, dass nur der OP seine tatsächliche Akte kennt, und ich nahm an, dass er einen Grund hatte, ihn zu wählen (eine Situation, die bei diesen Fragen üblich ist).
+0

Dies funktioniert nicht, wenn eine Datei den Namen "name.txt.txt" hat. – dbenham

+0

Dies wird auch einen Namen wie "name_txt.ext" – dbenham

+0

@ dbenham falsch verarbeiten: Sie haben Recht - ich habe diese Probleme kommentiert. – zb226

1

Sie könnten zwei verschachtelte for Schleifen wie folgt verwenden:

rem // Corrected file pattern (added a `.`): 
for %%A in ("*.txt.*") do (
    rem // Check (last) file extension: 
    if /I not "%%~xA"==".txt" (
     rem // Remove (last) file extension: 
     for %%B in ("%%~nA") do (
      rem // Check next-to-last file ext.: 
      if /I "%%~xB"==".txt" (
       call :renum "%%~A" 
      ) 
     ) 
    ) 
) 

Nach der Hilfe von for (Typ for /? in einem Eingabeaufforderungsfenster), die ~x Modifikator der for Variable abruft die Dateiendung (das ist der letzte Punkt . und alles danach). Der Modifizierer ~n ruft alle außer der Dateierweiterung ab, daher den Namen der Datei (Basis). Der obige Code verwendet zwei verschachtelte for-Schleifen, um die letzte und die vorletzte Dateierweiterung zu erhalten und sie gegen .txt zu prüfen (ohne Berücksichtigung der Groß- und Kleinschreibung).

Beachten Sie, dass die call-Befehlszeile für Dateien mit der Endung .txt.txt nicht ausgeführt wird.

+0

+1, aber ich verstehe nicht, warum Sie Ihre erste IF-Anweisung enthalten, die Namen wie "name.txt.txt" herausfiltert. Ich nehme an, das könnte unter Umständen wünschenswert sein, aber ich würde solche Namen wahrscheinlich umbenennen wollen. – dbenham

+0

@dbenham, wegen der OP-Beispiel, wo die zusätzliche Suffix ist numerisch wie '.1',' .2', ... Ich nahm an, wenn die letzte Erweiterung '.txt' ist, ist es schon in Ordnung ... – aschipfl

1

würde ich FINDSTR mit DIR/B verwenden und FOR/F

Im Folgenden werden die Namen mit einer beliebigen Anzahl von zusätzlichen Erweiterungen wie name.txt.ext und name.txt.ext.ext usw. verarbeitenDazu gehören ein Name wie name.txt.txt

for /f "delims= eol=:" %%F in (
    'dir /b /a-d *.txt.*^|findstr /i "\.txt\."' 
) do call :renum "%%F" 

Diese Variante wird nur mit einem einzigen zusätzlichen Erweiterungsprozess Namen wie name.txt.ext (einschließlich name.txt.txt)

for /f "delims= eol=:" %%F in (
    'dir /b /a-d *.txt.*^|findstr /i "\.txt\.[^.]*$"' 
) do call :renum "%%F" 

Sie auch in mein JREN.BAT regular expression file renaming utility überprüfen könnten. Es kann wahrscheinlich alle Ihre Dateien in einem Schritt filtern und umbenennen, ohne dass ein benutzerdefiniertes Batch-Skript benötigt wird.

Zum Beispiel wird im Folgenden nur Dateien umbenennen wie "name.txt.ext" suchen, und sie in "name_ext.txt"

jren "(\.txt)\.([^.]+)$" "_$2$1" /i 
+0

Was Wenn der Dateiname txt enthält? – Bharath

+0

@Bharath - Das führende Punktliteral in der Suchzeichenfolge verhindert die Übereinstimmung von txt innerhalb des Basisnamens. Technisch gesehen wird '.txt' als Teil des Basisnamens betrachtet, wenn es nicht am Ende ist, aber wir gehen davon aus, dass dies die beabsichtigte Erweiterung ist. – dbenham

+1

@Bharath - Wenn Sie einen Namen wie 'XXXXtxt.ext' einfügen möchten, ohne den führenden Punkt. dann benutze einfach "dir/b/a-d * txt. *^| findstr/i" txt \. "'' – dbenham