Batch: Dateierweiterung entfernen

155

Ich habe das folgende Batch-Skript von Wikipedia:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

In der for-Schleife werden alle Dateien mit der Erweiterung flv wiedergegeben, aber ich möchte einige Aktionen mit den Dateien ausführen, bei denen ich einmal die Datei ohne die Erweiterung und einmal mit der Erweiterung benötige. Wie könnte ich diese beiden bekommen?

Ich habe nach Lösungen gesucht, aber keine gefunden. Ich bin ein echter Neuling im Batch ...

Poru
quelle

Antworten:

308

Sie können %%~nfden Dateinamen nur wie in der Referenz beschrieben abrufen für for:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf
)
pause

Folgende Optionen stehen zur Verfügung:

Variable mit Modifikator Beschreibung

% ~ I ​​Erweitert% I, wodurch jegliche Umgebung entfernt wird 
                        Anführungszeichen ("").
% ~ fI Erweitert% I zu einem vollständig qualifizierten Pfadnamen.
% ~ dI Erweitert% I nur zu einem Laufwerksbuchstaben.
% ~ pI Erweitert% I nur auf einen Pfad.
% ~ nI Erweitert% I nur auf einen Dateinamen.
% ~ xI Erweitert% I nur zu einer Dateierweiterung.
% ~ sI Erweitert den Pfad so, dass er nur Kurznamen enthält.
% ~ aI Erweitert% I auf die Dateiattribute der Datei.
% ~ tI Erweitert% I auf Datum und Uhrzeit der Datei.
% ~ zI Erweitert% I auf die Dateigröße.
% ~ $ PATH: I Durchsucht die in der PATH-Umgebung aufgelisteten Verzeichnisse 
                        variabel und erweitert% I auf den vollständig qualifizierten Namen von 
                        der erste gefunden. Wenn der Name der Umgebungsvariablen lautet
                        nicht definiert oder die Datei wird bei der Suche nicht gefunden,
                        Dieser Modifikator wird auf die leere Zeichenfolge erweitert.    
Dirk Vollmar
quelle
8
Nur eine kurze Anmerkung: im obigen Beispiel %% f wäre so etwas wie C:\Users\Admin\Ordner\foo.flvund %% ~ nf würden Sie geben foo. Wenn Sie alles außer der Erweiterung wollen, verwenden Sie %% ~ df %% ~ pf %% ~ nf, was Ihnen geben würdeC:\Users\Admin\Ordner\foo
ehambright
8
@ehbrbright Später Kommentar, aber ich denke, die Verwendung %%~dpnfwäre eine kürzere Alternative.
Danke für die Modifikator / Beschreibungstabelle Dirk. Mein Fall war, den Dateinamen ohne Erweiterung von param %1in einem Batch-Skript zu erhalten. echo %~n1war was ich wollte.
Dave Pile
26

Falls die Datei, die Ihre Variable enthält, nicht vorhanden ist, funktioniert der FORAnsatz nicht. Ein Trick, den Sie verwenden können, wenn Sie die Länge der Erweiterung kennen, ist die Verwendung eines Teilstrings:

%var:~0,-4%

die -4Mittel , die die letzten 4 Ziffern (vermutlich .ext ) werden abgeschnitten.

Ohad Schneider
quelle
Dies funktioniert bei mir nicht (unter Win8.1) - vielleicht verstehe ich es falsch, wenn ich es echo %f:~0,-4%im Kontext des in der Frage verwendeten Beispiels versuche . Was mache ich falsch?
Wolf
2
Anscheinend funktioniert das für "normale" Variablen, nicht für FOR-Variablen (oder vielleicht kenne ich einfach nicht die richtige Syntax). Auf jeden Fall wird dies im Kontext des OP-Beispiels funktionieren: SET fl=%%fund dannecho %fl:~0,-4%
Ohad Schneider
@ Wolf Sie müssen den Wert der Schleifenvariablen auf eine normale Variable setzen und dann die Zeichenfolge in der normalen Variablen ersetzen / abschneiden
phuclv
In mehr als genug Fällen beträgt die Verlängerungslänge nicht 3 oder ist unbekannt. Sie können immer noch ein für verwenden, auch wenn die Datei nicht vorhanden ist, siehe meine Antwort.
Marsze
14

Ich bin auch ein Fremder für Windows Cmd, aber versuchen Sie Folgendes:

echo %%~nf
Vineet
quelle
8

Dies ist eine sehr späte Antwort, aber ich habe sie gefunden, um ein bestimmtes Problem zu lösen, das ich mit DiskInternals LinuxReader hatte, indem ich '.efs_ntfs' an Dateien anhängte, die in Nicht-NTFS-Verzeichnissen (FAT32) gespeichert wurden:

@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause
Agi Hammerthief
quelle
Ich bin nicht sicher, ob es die gestellte Frage beantwortet, aber es hat mir tatsächlich geholfen, danke!
matan7890
1
@ matan7890 True; Die Operation gibt nicht an, was "Ich möchte, dass einige Aktionen mit den Dateien ausgeführt werden" [sic] beinhaltet, aber eine dieser Aktionen kann darin bestehen, sie umzubenennen. In diesem Fall ist meine Antwort eine Erweiterung der akzeptierten Antwort.
Agi Hammerthief
Dies half einem Freund von mir, der einen Anhang öffnete und .encryptedalle seine Akten zusammen mit einer Lösegeldforderung hinzufügte. Anscheinend muss das angreifende Skript eine Batch-Datei gewesen sein, die umgekehrt ist und .encryptedallen Dateien hinzugefügt wurde .
AwokeKnowing
1
upvoted, weil Sie das Laufwerk, den Pfad und die Erweiterung ( %% ~ df %% ~ pf %% ~ nf ) erwähnen, die der Ausgabe von %% f aus der ursprünglichen Frage am ähnlichsten sind , anstatt nur den Dateinamen ohne Erweiterung ( %%) ~ nf )
Ehambright
5

Ich verwende dies, wenn ich einfach die Erweiterung aus einer Variablen entfernen möchte (ohne Verzeichnisse oder vorhandene Dateien zu schleifen):

for %%f in ("%filename%") do set filename=%%~nf

Wenn Sie die Erweiterung von einem vollständigen Pfad entfernen möchten, verwenden Sie %%dpnfstattdessen:

for %%f in ("%path%") do set path=%%~dpnf

Beispiel:

(Direkt in der Konsole verwenden)

@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf

OUTPUT:

file name
C:\Dir\file
Marsze
quelle
0

Verwenden Sie Cygwin Bash, um das Hacken durchzuführen

  :: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
  set FILE=%1
  for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a
mosh
quelle
0

Wenn Ihre Variable ein Argument ist, können Sie einfach %~dpngefolgt von der Argumentnummer verwenden, sodass Sie sich nicht um unterschiedliche Erweiterungslängen kümmern müssen.

Zum Beispiel %~dpn0wird der Pfad der Batchdatei ohne Erweiterung zurückkehren, %~dpn1wird %1ohne Verlängerung, usw.

Martin Braun
quelle