【问题标题】:IF EXIST - Files Without an ExtensionIF EXIST - 没有扩展名的文件
【发布时间】:2014-08-01 21:09:32
【问题描述】:

根据文件名移动各种文件的工作脚本成功运行。脚本完成后,它将使用IF EXIST *.txt 检查两个目录中是否存在任何延迟文件。这很好用,除了我注意到一些没有扩展名的文件。以前这些都不是问题,由于我无法控制的过程,这无法解决,我需要修改我的脚本。

我唯一的想法是下面的代码。忍耐,因为有两个条件:

:check1
PUSHD "\\UNC\path1" &&(
DIR /A-D *.
IF %errorlevel% NEQ 0 GOTO check2
) & POPD

:add1
ECHO Add note to the log file

:check2
PUSHD "\\UNC\path2" &&(
DIR /A-D *.
IF %errorlevel% NEQ 0 GOTO laststep
) & POPD

:add2
ECHO Add note to the log file

:laststep
Some other code before exiting

这应该在路径上运行DIR,如果存在没有扩展名的文件,它将%errorlevel% 为零并继续进行下一个检查。如果存在 no 文件,则它的 %errorlevel% 不为零(可能为 1),并且它会在下次检查之前将一些文本附加到日志中。检查两个会做同样的事情。

这似乎非常复杂,我找不到像IF EXIST 这样简单的“单线”解决方案。我意识到我可以使用*.,但这也会返回目录,并可能导致错误的%errorlevel%

更新代码

在我通常设置变量的地方,我还 SET 运行 DIR 的两条路径。通过这种方式,它们可以更容易地在其他地方使用并且我绕过了我通常遇到的 UNC 路径错误 - 我不知道原因。更新后的文件检查,仅用于没有扩展名的文件,是:

DIR %p1% /b /a-d|FIND /v "." && ECHO Found 1 >> %log%
DIR %p2% /b /a-d|FIND /v "." && ECHO Found 2 >> %log%
FINDSTR /I "Found" %log%
IF %errorlevel% EQU 0 GOTO stillthere

:nofiles
Some code
GOTO domore

:stillthere
Some code

:domore
Other code before exit

感谢您的回复,我从中学到了。

【问题讨论】:

    标签: batch-file if-statement for-loop dir


    【解决方案1】:

    这是你要找的吗?

    dir /b /a-d |find /v "."
    

    【讨论】:

      【解决方案2】:
      @ECHO OFF
      SETLOCAL
      :check1
      PUSHD "u:\path1"
      DIR /A-D *. >NUL 2>NUL
      IF %errorlevel% EQU 0 ECHO Add note \path1 to the log file
      POPD
      
      PUSHD "u:\path2"
      DIR /A-D *. >NUL 2>NUL
      IF %errorlevel% EQU 0 ECHO Add note \path2 to the log file
      POPD
      
      :laststep
      :: Some other code before exiting
      
      GOTO :EOF
      

      您的问题包括:

      在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何 %var% 都将替换为该变量的值在解析块时 - 在块执行之前 - 同样适用于 FOR ... DO (block)

      因此,IF (something) else (somethingelse) 将在遇到IF 时使用%variables% 的值执行。

      您可能会跳出PUSHD/POPD 括号,这意味着您的POPD 不一定会恢复您的起始目录。

      (请注意,我使用u:\ 而不是服务器来适应我的系统)

      【讨论】:

      • 这是很棒的信息!我没有想到可能会跳过POPD 并跳出顺序。有很多东西要学,也许还有更多的评论。最终,我会将您的建议用于我被要求编写的另一个脚本;谢谢你。对于这个特定的请求,我最终用@foxidrive 更新的DIR 命令更改了相关行。
      【解决方案3】:

      您已经在使用&& 来验证PUSHD 是否有效。您可以对您的DIR /-D 执行相同操作。我发现它让生活更轻松。此外,如果未找到 *.,您可能希望隐藏任何错误消息,尤其是因为这是预期的情况。我还隐藏了可能找到的任何文件的显示,但您当然可以摆脱这种重定向。如果 PUSHD 失败,您可能还想隐藏错误消息,但我没有实现。

      PUSHD "\\UNC\path1" && (
        DIR /A-D *. 1>nul 2>nul && ECHO Add note to the log file
        POPD
      )
      
      PUSHD "\\UNC\path2" && (
        DIR /A-D *. 1>nul 2>nul && ECHO Add note to the log file
        POPD
      )
      
      ECHO Some other code before exiting
      

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 2012-12-24
        • 2017-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 2018-08-06
        • 1970-01-01
        相关资源
        最近更新 更多