Пакет: удалить расширение файла - PullRequest
133 голосов
/ 09 июля 2010

У меня есть следующий пакетный скрипт из Википедии:

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

В цикле for отображаются все файлы с расширением flv, но я хочу выполнить некоторые действия с файлом (файлами), где янужен один раз файл без расширения и один раз с расширением.Как я мог получить эти два?

Я искал решения, но я не нашел одно.Я настоящий новичок в партии ...

Ответы [ 5 ]

277 голосов
/ 09 июля 2010

Вы можете использовать %%~nf, чтобы получить только имя файла, как описано в справочнике для for:

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

Доступны следующие опции:

Variable with modifier  Description

%~I                     Expands %I which removes any surrounding 
                        quotation marks ("").
%~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                    Expands path to contain short names only.
%~aI                    Expands %I to the file attributes of file.
%~tI                    Expands %I to the date and time of file.
%~zI                    Expands %I to the 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,
                        this modifier expands to the empty string.    
26 голосов
/ 01 октября 2013

В случае, если файл, который содержит ваша переменная, на самом деле не существует, подход FOR не будет работать.Если вы знаете длину расширения, вы можете использовать одну хитрость: взять подстроку:

%var:~0,-4%

* -4 означает, что последние 4 цифры (предположительно .ext )будет усечено.

14 голосов
/ 09 июля 2010

Я также незнаком с Windows CMD, но попробуйте это:

echo %%~nf
8 голосов
/ 30 марта 2013

Это очень запоздалый ответ, но я решил его, чтобы решить конкретную проблему, возникшую у меня с DiskInternals LinuxReader, добавляющим файл «.efs_ntfs» к файлам, которые он сохранил в каталогах, отличных от NTFS (FAT32):

@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
1 голос
/ 07 ноября 2018

Я использую это, если я просто хочу удалить расширение из переменной (без зацикливания каких-либо каталогов или существующих файлов):

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

Если вы хотите удалить расширение из полного пути, используйте %%dpnf вместо:

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

Пример:

(запись % вместо %% для использования этого непосредственно в консоли, а не внутри скрипта.)

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

REM ===========
REM OUTPUT:
REM file name
REM C:\Dir\file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...