Пакет: удаление расширения файла
У меня есть следующая партия 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