Batch file 批处理-鬼文件传递';如果不存在';检查 我的代码
下面我有一些简单的代码:Batch file 批处理-鬼文件传递';如果不存在';检查 我的代码,batch-file,file-exists,not-exists,Batch File,File Exists,Not Exists,下面我有一些简单的代码: 检查我的目录中是否存在文件 运行for循环以获取第一个文件名 根据文件名做东西 删除该文件 检查目录中是否存在任何其他文件(如果存在,请重复,如果不存在,请继续) 我的问题 我已经反复使用了这段代码,它的效果非常好,但在我最近的一次使用中,它看起来像是在寻找一个“幽灵”文件。当目录中没有文件时(只有一个存档文件夹),上面步骤1中的如果不存在检查仍会通过。因此,for循环中的设置代码会导致: 系统找不到指定的文件 然后,它似乎试图删除我的目录,并说: \\mypath*
如果不存在检查仍会通过。因此,for循环中的设置
代码会导致:
系统找不到指定的文件
然后,它似乎试图删除我的目录,并说:
\\mypath*,您确定(是/否)
然后,我必须手动终止一个自动批处理
我的问题
为什么它要通过如果不存在的检查,而不是跳到:nofile
我如何解释这个“ghost”文件(或者如果它正在检测存档文件夹——否则我怎么可以忽略它)?如果存在测试将查找目录中的任何内容
我将重新构造您的代码:
:MYLOOP
设置“found1=”
对于“%mypath%\*.*”中的%%F,请执行以下操作(
设置filenameWithExt=%%~nxF
设置文件名=%%~nF
设置文件路径=%%~pF
设置“found1=Y”
)
如果未定义found1转到nofile
执行其他特定于文件名的任务
删除“%mypath%\%FileName WithExt%”
转到MYLOOP
:nofile
如果
的未找到任何文件,found1
将保持未定义状态,因此我们转到:nofile
标签,否则我们将有一个文件要处理。删除文件后,只需返回到开头,清除标志并重复…Windows内核,因此Windows命令解释器也会解释通配符模式*.
,就像*
一样,它意味着任何文件或文件夹。在使用通配符模式时,*.
并不意味着文件(或文件夹)的名称必须带有点
因此,使用条件如果不存在“%mypath%\***”
与使用如果不存在“%mypath%\*”
相同
如果存在“%mypath%\*”
通常用于批处理文件,以验证%mypath%
指定的是文件夹而不是文件,因为此条件检查是否存在文件夹%mypath%
。如果该文件夹存在,则条件为true,与该文件夹中的文件和文件夹数量无关
因此,批处理文件顶部的条件不会检查文件夹%mypath%
中是否至少没有1个文件,而是检查该文件夹是否根本不存在
您可以使用以下批处理代码,通过使用子例程避免使用延迟扩展
@echo off
for /F "delims=" %%I in ('dir /A-D /B /ON "%mypath%\*" 2^>nul') do call :ProcessFile "%mypath%\%%I"
goto :EOF
:ProcessFile
set "FilenNmeWithExt=%~nx1"
set "FileName=%~n1"
set "FilePath=%~p1"
rem do other filename specific tasks
del "%~1"
goto :EOF
用于的命令执行命令行
dir /A-D /B /ON "%mypath%\*" 2>nul
在后台的单独命令过程中,捕获写入处理STDOUT的DIR的输出
如果目录根本不存在或不包含任何文件,DIR将输出错误消息以处理STDERR。通过使用2>NUL
将此错误消息重定向到设备NUL,可以抑制此错误消息。重定向操作符
必须在此处转义,插入符号^
首先由Windows命令解释器在解析整个FOR命令行时解释为文字字符,否则将导致语法错误
选项/A-D
表示DIR应输出未设置目录属性的所有目录项,即仅输出文件,而不是文件夹/B
将DIR的输出更改为裸格式,即仅显示文件名,不显示任何附加数据/ON
会在DIR输出整个列表之前按文件名对列表进行排序。这个选项在这里并不是真正必要的
FOR现在处理DIR的捕获输出。因此,在运行FOR时删除该目录中的文件并不重要FOR将初始列表作为DIR的输出进行处理
对于DIR输出的每个文件名,将执行子例程ProcessFile
,这类似于调用另一个具有该名称的批处理文件。传递给子例程的是文件名及其路径DIR仅输出不带路径的文件名,而不另外使用/S
获取指定目录及其所有子目录中所有文件名的列表
处理完DIR输出的所有文件名后,需要在FOR循环之后使用命令goto:EOF
,以避免子例程出错
如果上面的一行是批处理文件的最后一行,则不需要子例程后面的命令goto:EOF
。但是,在一般的良好实践中,如果像下面的另一个子例程那样添加更多的命令行,则总是以goto:EOF
结束子例程。对于Windows命令解释器,以其标签开头的子例程在文件中的位置无关紧要。因此,在继续之前是否要检查%mypath%
中是否有任何文件?如果要处理%mypath%
中的文件,我建议您,通过迭代dir/b“%mypath%\*.*”
的输出来实现它。我还没有实现它,但逻辑看起来非常合理——显然在这一点上,我无法通过树看到森林。谢谢哇!感谢您对@mofi的详细回复!我已经接受了Magoo的回答,但我想尽快回应我的感谢。这个
dir /A-D /B /ON "%mypath%\*" 2>nul