Wie bekomme ich den Dateinamen nur ohne Pfad in der Windows-Befehlszeile?

31
for /r %f in (*) do echo %f

Gibt den Ausgabedateinamen zusammen mit dem gesamten Pfad an

\path\to\dir\<filename>

Wie bekomme ich nur das <filename>ohne den Pfad mit? Ich muss diesen 'Dateinamen'-String verwenden.

Ist es auch möglich, Folgendes zu tun, sobald der Dateiname erfasst wurde?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)
Jay
quelle
3
Microsoft verfügt über eine Online- Befehlszeilenreferenz für Windows XP von A bis Z, die auch für spätere Versionen gültig ist. Die Dokumentation in der von Ihnen akzeptierten Antwort befindet sich am Ende des Abschnitts über den forBefehl.
Martineau
@martineau: Leider ist die Online-Seite 'Windows XP - Befehlszeilenreferenz AZ' nicht mehr online (von Microsoft entfernt) und eine Alternative für diese Dokumentation ist noch nicht verfügbar (soweit ich eine Codedokumentation finden kann unter ' % ~ 'Argument Dokumentation)
PapaAtHome
@PapaAtHome: Glücklicherweise kann man die Befehlszeilenreferenz immer noch über die Wayback-Maschine von web.archive.org anzeigen .
Martineau

Antworten:

54

Verwenden Sie %~nxffür <filename>.<extension>.

Und ja, Sie können Folgendes tun:

for /r %%f in (*) do (
echo "blah blah blah '%%~nxf'" >> blahblah_%%~nxf.txt
)

Siehe for /?:

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.
Bob
quelle
Gute Antwort. Irgendeine Idee, wie ich nach einem Teilstring in einem vollständigen Pfad suchen könnte? Zum Beispiel möchte ich wissen, ob c: \ code \ myapp \ .git \ somefolder den Text ".git" enthält.
Dale Barnard
1
Sie können durch Rohrleitungen den Weg in die eine textliche oder regex Suche durchführen findoder findstrBefehl, zum Beispiel echo %%f | find "\.git\" > NULoder echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULund dann die Überprüfung der Fehlerebene mit dem ifBefehl. (findstr regex ist sehr begrenzt, das ist also mein Versuch, ein führendes \und [entweder ein abschließendes \oder ein Ende der Zeichenfolge] durchzusetzen .) Beachten Sie, dass if errorleveles Macken mit Durchfall gibt und Sie wahrscheinlich nicht if %errorlevel%innerhalb einer Schleife arbeiten können. Möglicherweise müssen Sie SetLocal EnableDelayedExpansionzuerst und dann if !errorlevel!stattdessen.
Bob
@DaleBarnard Erwägen Sie auch die Verwendung von PowerShell - viel weniger Schmerzen und wahrscheinlich konsistentere Ergebnisse.
Bob
Das bla bla verwirrt mich, was soll es darstellen? Wie passt der vollständige Pfad der Datei und der extrahierte Dateiname in diese Antwort?
Thebunnyrules
@thebunnyrules %~nxfist der Dateiname, wie ich im ersten Satz sagte. Wenn Sie es in einer Batch - Datei verwenden, müssen Sie die verdoppeln %, so dass es %%~nxf. Sie nehmen blah blah blahnur das Beispiel in der Frage und ersetzen das filenameBit durch die %%~nxfErsetzung - die blahs sind nur Füllstoffe und haben keine besondere Bedeutung.
Bob
0

Ich kann noch keinen Kommentar abgeben, aber ich glaube, das Folgende sollte beachtet werden, um Verwirrung zu vermeiden.

Obwohl fdies als FOR-Variablenname verwendet werden kann, ist es am besten, einen anderen Buchstaben zu verwenden, um eine Verwechslung mit dem Formatbuchstaben zu vermeiden f(der, wie in Bobs Antwort angegeben, den vollständigen Pfadnamen zurückgibt) oder zumindest ein Großbuchstaben zu verwenden F.

HYBRIDWESEN
quelle