Batch file 批处理-鬼文件传递';如果不存在';检查 我的代码

Batch file 批处理-鬼文件传递';如果不存在';检查 我的代码,batch-file,file-exists,not-exists,Batch File,File Exists,Not Exists,下面我有一些简单的代码: 检查我的目录中是否存在文件 运行for循环以获取第一个文件名 根据文件名做东西 删除该文件 检查目录中是否存在任何其他文件(如果存在,请重复,如果不存在,请继续) 我的问题 我已经反复使用了这段代码,它的效果非常好,但在我最近的一次使用中,它看起来像是在寻找一个“幽灵”文件。当目录中没有文件时(只有一个存档文件夹),上面步骤1中的如果不存在检查仍会通过。因此,for循环中的设置代码会导致: 系统找不到指定的文件 然后,它似乎试图删除我的目录,并说: \\mypath*

下面我有一些简单的代码:

  • 检查我的目录中是否存在文件
  • 运行for循环以获取第一个文件名
  • 根据文件名做东西
  • 删除该文件
  • 检查目录中是否存在任何其他文件(如果存在,请重复,如果不存在,请继续)

  • 我的问题 我已经反复使用了这段代码,它的效果非常好,但在我最近的一次使用中,它看起来像是在寻找一个“幽灵”文件。当目录中没有文件时(只有一个存档文件夹),上面步骤1中的
    如果不存在检查仍会通过。因此,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