IF EXIST - 没有扩展名的文件

时间:2014-08-01 21:09:32

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

基于文件名移动各种文件的工作脚本成功运行。脚本完成后,它将使用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

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

3 个答案:

答案 0 :(得分:4)

这是你想要找到的吗?

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

答案 1 :(得分:1)

@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%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

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

并且您可能跳出IF括号,这意味着您的PUSHD/POPD无法恢复您的起始目录。

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

答案 2 :(得分:0)

您已使用&&来验证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