BATCH文件if else总是执行else,使用do时的语法是什么

时间:2018-05-25 06:24:15

标签: batch-file

我正在检查网络驱动器是否存在,如果我将文本文件复制到它,否则我回应它不存在

我的问题是它执行if但每次都总是执行else 我有双重检查匹配括号并搜索语法,我想知道它是否与do

有关

请参阅以下代码

@echo off
set LOGFILE=inv.filie.log
call :LOG >> %LOGFILE%
exit /B

:LOG
E:

echo.
echo *** Date: %DATE:/=-%  Time:%TIME::=-% *** 
echo.


CD "E:\Ftp\Clients\OUT_TEST\INV\"

echo.
echo.
echo Moving Files to Test:

For %%G in (*.txt) do ( 
    if exist z:\ (
        COPY /Y "%%G" "Z:\Outgoing\" 
        MOVE /Y "%%G" "E:\Ftp\Clients\OUT_TEST\INV\Archive\"
    )
    else (
        echo Direcotry Z:\ for test is offline
    )
)

echo.
echo.
echo *** Task complete ***

inv.file.log的输出是

*** Date: 2018-05-25  Time: 8-11-53.89 *** 

Moving Files to Test AS2:
        1 file(s) copied.
        1 file(s) moved.
Direcotry Z:\ for test is offline


*** Task complete ***

从上面可以看出,它始终与行Direcotry Z:\ for test is offline

相呼应

感谢任何帮助

1 个答案:

答案 0 :(得分:3)

这不是有效的语法,括号和else必须在同一行。

以下脚本:

@echo off
if exist c:\ (
    echo if true
)
else (
    echo if false
)

将生成:

if true
'else' is not recognized as an internal or external command,
operable program or batch file.
if false

因为它将第一个右括号视为if语句的 end

我不确定为什么你没有看到错误,除非你用2>nul:调用你的脚本 - 这会丢掉错误而你只是看到:< / p>

if true
if false

无论如何,正确的方法是正确格式化if语句。在你的情况下,那将是:

for %%g in (*.txt) do ( 
    if exist z:\ (
        copy /y "%%g" "z:\outgoing\" 
        move /y "%%g" "e:\ftp\clients\out_test\inv\archive\"
    ) else (
        echo Directory z:\ for test is offline.
    )
)

可能也可以通过而不是检查每个文件是否存在z:来使其更好。您可能会发现这更好用:

if not exist z:\ (
    echo Directory z:\ for test is offline.
) else (
    copy /y *.txt "z:\outgoing\" 
    move /y *.txt "e:\ftp\clients\out_test\inv\archive\"
)

请注意,我并不是说 更好,因为您可以访问比I更多的上下文。这是您应该根据完整图片做出的决定。