使batch fileFOR命令工作,没有通配符?

我已经看过如何使用通过目录的batch file和处理匹配通配符expression式的各种文件的例子,例如:

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”解释为string,并始终运行FOR循环一次。 我怎样才能尝试在当前目录中匹配确切的文件名,没有通配符?

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

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

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

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

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

如果你不能使用通配符,只有在文件存在时才执行代码,那么有一些选项,其中大部分都包含一些问题。

如果不需要使用可更换参数的修饰符,则可以简单地使用

 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 /ad "somefile.ext") && ( echo file exists ) || ( echo file does not exist ) 

或者,如果需要的话

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

在这两种情况下,都会执行dir命令来检查文件的存在,而不是文件夹( /ad )以及用于确定要执行的代码的条件执行操作符。

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