18

如果我使用以下方法迭代每个文件:

@echo off

FOR %%f IN (*\*.\**) DO (
    echo %%f
)

如何打印每个文件的扩展名?我尝试将 %%f 分配给临时变量,然后使用代码 :echo "%t:~-3%"打印但没有成功。

4

3 回答 3

36

FOR 命令有几个允许您修改文件名的内置开关。尝试以下操作:

@echo off
for %%i in (*.*) do echo "%%~xi"

有关更多详细信息,请使用help for获取修饰符的完整列表 - 有很多!

于 2008-09-26T11:22:49.083 回答
7

这行得通,尽管它的速度并不快:

@echo off
for %%f in (*.*) do call :procfile %%f
goto :eof

:procfile
    set fname=%1
    set ename=
:loop1
    if "%fname%"=="" (
        set ename=
        goto :exit1
    )
    if not "%fname:~-1%"=="." (
        set ename=%fname:~-1%%ename%
        set fname=%fname:~0,-1%
        goto :loop1
    )
:exit1
    echo.%ename%
    goto :eof
于 2008-09-26T11:39:35.177 回答
3

Sam的答案绝对是您想要的最简单的答案。但我想补充:

不要在a 的's 中使用set变量并期望立即使用它,除非您之前已发布()for

setlocal ENABLEDELAYEDEXPANSION

并且您使用!而不是 % 来包装变量名。例如,

@echo off
setlocal ENABLEDELAYEDEXPANSION

FOR %%f IN (*.*) DO (

   set t=%%f
   echo !t:~-3!

)

查看

set /?

了解更多信息。

另一种选择是调用一个子例程来执行set,就像Pax显示的那样。

于 2009-04-03T05:02:08.073 回答