Пакет: удалить расширение файла

155

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

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

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

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

Poru
источник

Ответы:

309

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

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

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

Переменная с модификатором Описание

% ~ I ​​расширяет% I, что удаляет любое окружение 
                        кавычки ("").
% ~ fI Расширяет% I до полного имени пути.
% ~ dI Расширяет% I только до буквы диска.
% ~ pI Расширяет% I только путь.
% ~ nI Расширяет% I только до имени файла.
% ~ xI Расширяет% I только до расширения файла.
% ~ sI Расширяет путь, чтобы содержать только короткие имена.
% ~ aI Расширяет% I до атрибутов файла.
% ~ tI Расширяет% I до даты и времени файла.
% ~ zI Увеличивает% I до размера файла.
% ~ $ PATH: я ищу каталоги, перечисленные в среде PATH 
                        переменная и расширяет% I до полного имени 
                        первый найден. Если имя переменной среды
                        не определен или файл не найден в результате поиска,
                        этот модификатор расширяется до пустой строки.    
Дирк Воллмар
источник
8
Просто небольшое замечание: в приведенном выше примере %% f будет примерно таким же, C:\Users\Admin\Ordner\foo.flvа %% ~ nf даст вам foo. Если вы хотите все, кроме расширения, используйте %% ~ df %% ~ pf %% ~ nf, что даст вамC:\Users\Admin\Ordner\foo
ehambright
8
@ehambright Поздний комментарий, но я думаю, что использование %%~dpnfбудет более короткой альтернативой.
Спасибо за модификатор / описание таблицы Dirk. Мой случай получал имя файла без расширения из param %1в пакетном скрипте. echo %~n1было то, что я был после.
Дейв Пайл
26

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

%var:~0,-4%

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

Охад Шнайдер
источник
Это не работает для меня (на Win8.1) - возможно, я неправильно понял это при попытке echo %f:~0,-4%в контексте примера, используемого в вопросе. Что я делаю не так?
Вольф
2
Очевидно, это работает для «обычных» переменных, а не для переменных FOR (или, может быть, я просто не знаю правильный синтаксис). В любом случае это будет работать в контексте примера OP: SET fl=%%fа затемecho %fl:~0,-4%
Охад Шнайдер
@ Волк, вам нужно установить значение переменной цикла в нормальную переменную, а затем выполнить подстановку / усечение строки в нормальной переменной
phuclv
В более чем достаточном количестве случаев длина расширения не равна 3 или неизвестна. Вы все еще можете использовать для даже если файл не существует, см. Мой ответ.
Марш
14

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

echo %%~nf
Vineet
источник
8

Это очень запоздалый ответ, но я решил это, чтобы решить конкретную проблему, возникшую у меня с 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
Agi Hammerthief
источник
Я не уверен, что он отвечает на заданный вопрос, но на самом деле это помогло мне, спасибо!
matan7890
1
@ matan7890 True; Операция не определяет, что влечет за собой «Я хочу выполнить некоторые действия с файлом (файлами)» [sic], но одним из этих действий может быть их переименование, и в этом случае мой ответ является расширением принятого ответа.
Agi Hammerthief
Это помогло моему другу, который открыл вложение и .encryptedдобавил все свои файлы вместе с требованием выкупа. Очевидно, что атакующий сценарий должен был быть командным файлом, который обратен этому и был добавлен .encryptedко всем файлам.
Проснулся, Зная
1
проголосовал, потому что вы упомянули диск, путь и расширение ( %% ~ df %% ~ pf %% ~ nf ), которое больше всего напоминает вывод %% f из оригинального вопроса, а не только имя файла без расширения ( %% ~ nf )
ehambright
5

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

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 %~dpnf

OUTPUT:

file name
C:\Dir\file
marsze
источник
0

Использование Cygwin Bash для измельчения

  :: 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
мош
источник
0

Если ваша переменная является аргументом, вы можете просто использовать %~dpnсопровождаемый номером аргумента, чтобы вам не пришлось беспокоиться о разной длине расширения.

Например %~dpn0, вернет путь к пакетному файлу без его расширения, %~dpn1будет %1без расширения и т. Д.

Мартин Браун
источник