0

我有一个包含文件名列表的变量,并且基于扩展名,我需要执行不同的操作。我无法提取循环内的扩展

set BINARIES=file1.dll fil2.dll fil3.sys

:: for each file in list of binaries do
FOR %%G IN (%BINARIES%) DO (
    :: if extension is dll
    if /i [%%G:~-4%]==[.dll] (
        echo dll file
        ) else (
            echo sys file
        )
)

如果条件总是失败。如何正确提取扩展名。

4

3 回答 3

2
if /i "%%~xG"==".dll"

从 cmd shell 窗口帮助for /?

此外,增强了 FOR 变量引用的替换。
您现在可以使用以下可选语法:

    %~I - 扩展 %I 删除任何周围的引号 (")
    %~fI - 将 %I 扩展为完全限定的路径名
    %~dI - 仅将 %I 扩展为驱动器号
    %~pI - 仅将 %I 扩展为路径
    %~nI - 仅将 %I 扩展为文件名
    %~xI - 仅将 %I 扩展为文件扩展名
    %~sI - 扩展路径仅包含短名称
    %~aI - 将 %I 扩展为文件的文件属性
    %~tI - 将 %I 扩展到文件的日期/时间
    %~zI - 将 %I 扩展为文件大小
    %~$PATH:I - 搜索 PATH 中列出的目录
                   环境变量并将 %I 扩展到
                   找到的第一个名称的完全限定名称。
                   如果环境变量名不是
                   已定义或文件未找到
                   搜索,然后这个修饰符扩展为
                   空字符串

可以组合修饰符以获得复合结果:

    %~dpI - 仅将 %I 扩展为驱动器号和路径
    %~nxI - 仅将 %I 扩展为文件名和扩展名
    %~fsI - 将 %I 扩展为仅包含短名称的完整路径名
    %~dp$PATH:I - 搜索 PATH 中列出的目录
                   %I 的环境变量并扩展为
                   找到的第一个驱动器号和路径。
    %~ftzaI - 将 %I 扩展为类似 DIR 的输出线
于 2013-08-24T03:12:52.910 回答
0
set BINARIES=file1.dll fil2.dll fil3.sys

FOR %%G IN (%BINARIES%) DO echo %%G has a %%~xG extension.
于 2013-08-24T05:14:02.707 回答
0

不知道能不能用这个:%%G:~-4%

此外,您必须使用变量的延迟扩展。关键是使用'!' 而不是 '%' 在某些地方。检查“set /?”,它给出了一个(令人困惑的)示例。

我不太记得它背后的理论,但这对我有用:

setlocal enabledelayedexpansion

set BINARIES=file1.dll fil2.dll fil3.sys

:: for each file in list of binaries do
FOR %%G IN (%BINARIES%) DO (
    :: if extension is dll
    set x=%%g
    set y=!x:~-4!
    if /i [%y%]==[.dll] (
        echo dll file
        ) else (
            echo sys file
        )
)
于 2013-08-24T02:22:03.193 回答