我有以下来自维基百科的批处理脚本:
@echo off
for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
echo %%f
)
pause
在for循环中,所有扩展名为flv的文件都会被回显出来, 但我想对文件执行一些操作, 需要一次使用没有扩展名的文件和一次使用有扩展名的文件。 我该如何得到这两个文件呢?
我搜索了解决方案,但没有找到。 我是批处理的新手...
我有以下来自维基百科的批处理脚本:
@echo off
for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
echo %%f
)
pause
在for循环中,所有扩展名为flv的文件都会被回显出来, 但我想对文件执行一些操作, 需要一次使用没有扩展名的文件和一次使用有扩展名的文件。 我该如何得到这两个文件呢?
我搜索了解决方案,但没有找到。 我是批处理的新手...
您可以使用 %%~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,获得找到的第一个完全合格的文件名。如果未定义环境变量名称或未通过搜索找到文件,则该修改符扩展为空字符串。
如果您的变量中包含的文件实际上不存在,则FOR
方法将无法工作。 如果您知道扩展名的长度,可以使用一个技巧,即截取子字符串:
在这种情况下,如果你的变量中所代表的文件不存在,FOR
方法就不会起作用。 一种技巧是,如果你知道文件扩展名的长度,那么可以截取子字符串:
%var:~0,-4%
-4
表示最后4位数字(可能是.ext)将被截断。
echo %f:~0,-4%
时我误解了它。 我做错了什么? - WolfSET fl=%%f
,然后echo %fl:~0,-4%
。 - Ohad Schneider不使用循环
如果我只想从文件名或变量中去掉扩展名(而不列出任何目录或现有文件),我会使用这个:
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
我对Windows的命令行也不太熟悉,但可以试试这个方法:
echo %%~nf
%~dpn
(对于路径)或%~n
(仅包含名称),后面跟着参数编号,这样你就不用担心扩展名长度的变化。%~dpn0
将返回批处理文件的路径而不包含其扩展名,%~dpn1
将为%1
,不包含扩展名,以此类推。%~n0
将返回批处理文件的名称而不带有其扩展名,%~n1
将为%1
,不包含路径和扩展名,以此类推。%~dpfn0
,当你仔细看时它开始变得有意义:
%~dpn
保留了整个文件路径,但不包括扩展名,而 %~nf
则以某种方式保留了扩展名。 - Guillaume F.@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
:: 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
C:\Users\Admin\Ordner\foo.flv
,而 %%~nf 将给出foo
。如果您想获得除扩展名之外的所有内容,请使用 %%df%%pf%%~nf,这将给您C:\Users\Admin\Ordner\foo
。 - ehambright%%~dpnf
可以是更短的替代方案。 - user6250760%1
获取不带扩展名的文件名。echo %~n1
正是我想要的。 - Dave Pile