it-swarm.com.ru

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

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

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

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

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

133
Poru

Вы можете использовать %%~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: I Выполняет поиск каталогов, перечисленных в переменной среды 
 Среды PATH, и раскрывает% I до полного имени 
 The f Первый найден. Если имя переменной среды 
 Не определено или файл не найден в результате поиска, 
 Этот модификатор расширяется до пустой строки. 
277
Dirk Vollmar

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

%var:~0,-4%

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

26
Ohad Schneider

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

echo %%~nf
14
Vineet

Это очень запоздалый ответ, но я пришел к нему, чтобы решить конкретную проблему, возникшую у меня с 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
8
Agi Hammerthief

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

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
1
marsze