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

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

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

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

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

Ответ 1

Вы можете использовать %%~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.    

Ответ 2

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

%var:~0,-4%

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

Ответ 3

Я тоже незнакомец с окнами cmd, но попробуйте это:

echo %%~nf

Ответ 4

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

Ответ 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 %~nf

REM ===========
REM OUTPUT:
REM file name
REM C:\Dir\file

Ответ 6

Использование 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