Як отримати ім'я файлу лише без шляху в командному рядку Windows?


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

Дає назву вихідного файла разом з усім контуром

\path\to\dir\<filename>

Як я можу отримати просто <filename>без включеного шляху? Мені потрібно використовувати цей рядок "ім'я файлу".

Крім того, чи можливо зробити наступне, як тільки назву файлу буде придбано?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)

3
Для подальшої довідки Microsoft має онлайн- сервер Windows XP - Командний рядок AZ, який все ще застосовується до більш пізніх версій. Документація у відповіді, яку ви прийняли, знаходиться в кінці розділу про forкоманду.
мартіно

@martineau: На жаль, онлайн-сторінка "Windows XP - Командний рядок AZ" більше не в режимі он-лайн (видалена мікрософт), і альтернатива цій документації ще не доступна (наскільки я можу знайти будь-яку кодументацію на " % ~ 'аргументація документації)
PapaAtHome

@PapaAtHome: На щастя, все ще можна переглянути посилання на командний рядок через зворотну машину web.archive.org .
мартіно

Відповіді:


54

Використовувати %~nxfдля <filename>.<extension>.

І так, ви можете:

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

Дивіться 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.

Чудова відповідь. Будь-яка ідея, як я міг шукати підрядку в повному обсязі? Наприклад, я хочу знати, чи містить текст c: \ code \ myapp \ .git \ somefolder текст ".git".
Дейл Барнард

1
Ви можете виконати пошук у текстовому або регекс-форматі, проклавши шлях до команди findабо findstr, наприклад, echo %%f | find "\.git\" > NULабо, echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULа потім перевірити рівень помилок за допомогою ifкоманди. (findstr regex дуже обмежений, тому це моя спроба застосувати провідний \і [або трейлінг, \або кінець рядка]). Зверніть увагу на те, що if errorlevelє химерність з пропусканням, і ви, ймовірно, не можете if %errorlevel%знаходитись у циклі, тому вам може знадобитися SetLocal EnableDelayedExpansionспочатку, а потім if !errorlevel!замість цього.
Боб

@DaleBarnard Крім того, подумайте про використання PowerShell - набагато менше болю і, ймовірно, більш стійкі результати.
Боб

Бла бла, що мене бентежить, що він повинен представляти? Як повний шлях до файлу та вилучене ім’я файлу вписуються в цю відповідь?
thebunnyrules

@thebunnyrules %~nxf- це ім'я файлу, як я вже сказав у першому реченні. Коли ви використовуєте його в пакетному файлі, вам потрібно подвоїти його %, зробивши його %%~nxf. blah blah blahПросто беручи приклад в цьому питанні і замінити filenameбіт з %%~nxfзаміщенням - в blahs тільки наповнювач і не мають особливого значення.
Боб

0

Я поки не в змозі коментувати, але вважаю, що слід уникати плутанини.

Хоча fйого можна використовувати як ім'я змінної FOR, найкраще використовувати іншу літеру, щоб не плутати її з літером формату f(який, як зазначено у відповіді Боба, повертає повну назву шляху) або хоча б використовувати велику літеру F.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.