Jak uzyskać nazwę pliku tylko bez ścieżki w wierszu poleceń systemu Windows?

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

Podaje wyjściową nazwę pliku wraz z całą ścieżką

\path\to\dir\<filename>

Jak mogę uzyskać dostęp <filename>bez uwzględnienia ścieżki? Muszę użyć tego ciągu „nazwa pliku”.

Czy można również wykonać następujące czynności po uzyskaniu nazwy pliku?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)
Sójka
źródło
3
Na przyszłość Microsoft ma internetowy system Windows XP - numer referencyjny wiersza polecenia AZ, który nadal ma zastosowanie głównie do późniejszych wersji. Dokumentacja w zaakceptowanej odpowiedzi znajduje się na końcu sekcji forpolecenia.
martineau
@martineau: Niestety strona internetowa „Windows XP - odwołanie do wiersza polecenia AZ” nie jest już dostępna online (usunięta przez Microsoft), a alternatywa dla tej dokumentacji nie jest jeszcze dostępna (o ile mogę znaleźć dowolną dokumentację na temat „ Dokumentacja argumentu% ~ ')
PapaAtHome
@PapaAtHome: Na szczęście nadal można wyświetlić odwołanie do wiersza poleceń na maszynie wayback web.archive.org .
martineau,

Odpowiedzi:

54

Użyj %~nxfdla <filename>.<extension>.

I tak, możesz zrobić:

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

Zobacz 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.
Kok
źródło
Świetna odpowiedź. Masz pomysł, jak wyszukać podciąg w pełnej ścieżce? Na przykład chcę wiedzieć, czy c: \ code \ myapp \ .git \ somefolder zawiera tekst „.git”.
Dale Barnard
1
Możesz przeprowadzić wyszukiwanie tekstowe lub wyrażenia regularne, przesyłając ścieżkę do polecenia findlub findstr, np. echo %%f | find "\.git\" > NULLub, echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULa następnie sprawdzając poziom błędu za pomocą ifpolecenia. (findstr regex jest bardzo ograniczony, więc to moja próba wymuszenia wiodącego \i [ \końca lub końca łańcucha]). Zauważ, że if errorlevelma dziwactwa z upadkiem i prawdopodobnie nie możesz znaleźć się if %errorlevel%w pętli, więc być może będziesz musiał SetLocal EnableDelayedExpansionnajpierw, a potem if !errorlevel!zamiast tego.
Bob
@DaleBarnard Rozważ także użycie PowerShell - znacznie mniej bólu i prawdopodobnie bardziej spójne wyniki.
Bob
Bla, bla, mylą mnie, co to ma reprezentować? W jaki sposób pełna ścieżka pliku i nazwa wyodrębnionego pliku pasuje do tej odpowiedzi?
thebunnyrules 28.04.17
@ thebunnyrules %~nxfto nazwa pliku, jak powiedziałem w pierwszym zdaniu. Kiedy używasz go w pliku wsadowym, musisz go podwoić %, czyniąc go %%~nxf. blah blah blahJest to na przykładzie w pytaniu i zastępowania filenameświdra z %%~nxfpodstawienia - gdy blahS są tylko wypełniacz i nie mają szczególnego znaczenia.
Bob
0

Nie jestem jeszcze w stanie komentować, ale uważam, że należy przestrzegać poniższych wskazówek, aby uniknąć nieporozumień.

Chociaż fmożna go użyć jako nazwy zmiennej FOR, najlepiej użyć innej litery, aby uniknąć pomylenia jej z literą formatu f(która, jak stwierdzono w odpowiedzi Boba, zwraca pełną nazwę ścieżki), lub przynajmniej użyj dużej litery F.

HYBRYDOWA Istota
źródło