使批处理文件FOR命令工作没有通配符?

时间:2015-09-22 16:46:06

标签: windows batch-file for-loop cmd

我已经看过如何使用遍历目录的批处理文件并处理与通配符表达式匹配的各种文件的示例,例如:

FOR %%f IN (*.ext) DO (
    ECHO Found ext file %cd%\%%f
)

以上内容仅匹配当前目录中以.ext结尾的文件。但是如果我只想匹配一个确切的文件名,如果它存在于该目录中呢?我想要这样的东西:

FOR %%f IN (someFile.ext) DO (
    ECHO Found our file name in %cd%
)

然而,这似乎不起作用; FOR命令解释" somefile.ext"作为字符串并始终运行FOR循环一次。如何尝试匹配当前目录中的确切文件名,没有通配符?

2 个答案:

答案 0 :(得分:0)

Windows需要“通配符”表达式才能使FOR循环按预期运行。因此,您可以提供此类表达式,同时可能通过通配符匹配额外文件,并使用额外的IF语句将其过滤掉:

FOR %%f IN (somefile.ext*) DO (
    IF /I "%%f"=="somefile.ext" (
        ECHO Found somefile.ext in
        ECHO dir: %cd%
        ECHO.
    )
)

...或者首先使用IF语句来检查文件是否存在:

IF EXIST somefile.ext (
    ECHO Found somefile.ext in
    ECHO dir: %cd%
    ECHO.
)

答案 1 :(得分:0)

没有什么可以改变的,因为它有效。它只是没有做你期望它做的事。

for命令旨在迭代一组不需要是文件或文件夹的元素,但当集合中的某个元素包含通配符时,它将被视为查询到文件系统,集合中的元素将替换为与通配符表达式匹配的文件/文件夹列表。

您可以在表达式中包含通配符(是的,问题是"没有通配符" )以强制for命令检查文件系统,但是没有办法创建一个只匹配你的文件的通配符表达式而没有匹配另一个的可能性,所以你还需要检查正在处理的元素是否是必需的。

for %%a in ("somefile.ext?") do if /i "%%~nxa"=="somefile.ext" (
     echo File exists
)

如果您不能使用通配符并且仅在文件存在时执行代码,则有一些选项,其中大多数都包含一些问题。

如果您不需要使用for可替换参数的修饰符,则只需使用

if exist "somefile.ext" (
    rem your code
)

或者,如果您需要可替换参数及其修饰符

for %%a in ("somefile.ext") do if exist "%%~fa" (
    rem your code
)

note :如果你不打算为文件引用使用变量,我比if exist "file" for %%a in ("file")更喜欢它,因为只有一个地方引用了文件名)

两个选项都会检查文件系统是否存在指定的元素,但两者都不会看到文件和文件夹之间的区别。

所以,只是为了确定它存在,而且它不是一个文件夹,必须进行额外的检查以丢弃文件夹(也检查somefile.ext\不存在),或者我们可以使用像

(>nul 2>&1 dir /a-d "somefile.ext") && (
    echo file exists
) || (
    echo file does not exist
)

或者,如果需要for

for %%a in ("somefile.ext") do (>nul 2>&1 dir /a-d "%%~fa") && (
    echo %%~fa exists
) || (
    echo %%~fa does not exist
)

在这两种情况下,执行dir命令以检查文件是否存在,而不是文件夹(/a-d),以及用于确定要执行的代码的条件执行运算符。

注意:我放弃了任何暗示必须获得文件读取句柄的选项,因为它可能存在但不可读。