【问题标题】:Make batch file FOR command work with no wildcard characters?使批处理文件 FOR 命令在没有通配符的情况下工作?
【发布时间】:2015-12-19 18:11:49
【问题描述】:

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

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 循环。如何尝试匹配当前目录中的确切文件名,而不使用通配符?

【问题讨论】:

  • 如果只检查单个文件,请使用if exists 检查。
  • if exist,实际上。 help if 在 cmd 控制台中获取更多信息。
  • for 如果指定了专用路径,则不会检查文件系统;仅在需要时,即给定通配符*?,才访问文件系统;
  • 这个问题你可能会感兴趣:stackoverflow.com/questions/22395010/…
  • @GovindParmar 有趣,我在想分机中的通配符问号:for %g in ("someFile.ex?") do echo found %~g

标签: windows batch-file for-loop cmd


【解决方案1】:

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.
)

【讨论】:

    【解决方案2】:

    没有什么可以改变的,因为它正在工作。它只是没有做你期望它做的事情。

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

    你可以在表达式中包含一个通配符(是的,问题是“with no wildcard”)来强制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
    )
    

    注意:如果你不打算使用变量作为文件引用,我比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),以及用于确定要执行的代码的条件执行运算符。

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

    【讨论】:

    • 请您编辑您的答案以添加为什么使用%%~fa%%~nxa 而不是%%f
    • @Jez,假设您使用带路径的文件引用。在我使用%%~nxa 作为条件的右侧部分是名称和扩展名的情况下,我只是检查文件名和扩展名,无论%%a 可以包含什么。在其余情况下,我直接使用文件的完整路径 (%%~fa),这只是我的一个习惯。我更喜欢明确指出我在每种情况下使用的值。无论如何,因为我使用%%a 作为for 可替换参数%%f 尚未定义
    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2013-07-21
    相关资源
    最近更新 更多