我已经看过如何使用通过目录的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
)以及用于确定要执行的代码的条件执行操作符。
注 :我放弃了任何意味着必须获得文件读取句柄的选项,因为它可能存在但不可读。