批处理文件 - 如果不存在则不起作用

时间:2016-11-04 13:21:45

标签: batch-file if-statement

我有一个问题,我试图在尝试下载文件之前确定文件系统上是否存在给定目录。

批处理文件:

:: Create Apache Directory if does not exist
mkdir "%HOMEDRIVE%\Apache" 2> nul

:: Setup Apache Ant if Ant does not exist
if not exist "%HOMEDRIVE%\Apache\apache-ant-1.9.7\" (
    :: Set filename variable
    SET "FILENAME=%~dp0\apache-ant-1.9.7-bin.zip"

    :: Download ANT from mirror
    bitsadmin.exe /transfer "Apache Ant Download" http://mirrors.ukfast.co.uk/sites/ftp.apache.org//ant/binaries/apache-ant-1.9.7-bin.zip "%FILENAME%"

    :: Copy Apache Ant to C:\Apache-Ant
    xcopy "%~dp0apache-ant-1.9.7-bin.zip"  %HOMEDRIVE%\Apache\.

    :: Delete zip file from curent directory
    del "%~dp0apache-ant-1.9.7-bin.zip"

    :: Unzip Apache Ant to C:\Apache-Ant
    call :UnZipFile "%HOMEDRIVE%\Apache\" "%HOMEDRIVE%\Apache\apache-ant-1.9.7-bin.zip"

    :UnZipFile <ExtractTo> <newzipfile>
    set vbs="%temp%\_.vbs"
    if exist %vbs% del /f /q %vbs%
    >%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
    >>%vbs% echo If NOT fso.FolderExists(%1) Then
    >>%vbs% echo fso.CreateFolder(%1)
    >>%vbs% echo End If
    >>%vbs% echo set objShell = CreateObject("Shell.Application")
    >>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
    >>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
    >>%vbs% echo Set fso = Nothing
    >>%vbs% echo Set objShell = Nothing
    cscript //nologo %vbs%
    if exist %vbs% del /f /q %vbs%

    :: Delete zip folder
    del "%HOMEDRIVE%\Apache\apache-ant-1.9.7-bin.zip"

    :: Set ANT_HOME path
    setx ANT_HOME "%HOMEDRIVE%\Apache\apache-ant-1.9.7" /m

    :: Add ANT to path
    setx path "%PATH%;%HOMEDRIVE%\Apache\apache-ant-1.9.7\bin" /m
)

更新:我已添加@aschipfl建议

目录C:/Apache/apache-ant-1.9.7存在,因此代码应该失败但是在运行时它仍然会下载文件并尝试在那里进行进一步的设置。任何想法都错了,为什么if语句在不应该执行的地方执行?

由于

1 个答案:

答案 0 :(得分:1)

块内不允许使用标签(括号内的一系列指令)

如果需要,md将创建中间目录。

批处理不了解程序。如果call是子程序,那么子程序结束时(到达文件结尾或exit)执行将返回到call之后的指令 - 所以:UnZipFile用你的代码。

:unzipfile例程移至文件末尾并在其前面插入goto :eof,以确保代码不会流向:unzipfile
goto :eof添加到:unzipfile的末尾,以便稍后可以添加额外的代码(如更多子例程)。 goto :eof具体表示“转到物理文件结束”,它终止当前例程。

请注意setx不会影响当前环境,也不会影响现有 cmd个实例,只会 cmd个实例,因此执行setsetx

if exist "%HOMEDRIVE%\Apache\apache-ant-1.9.7\" goto ant197exists
:: Setup Apache Ant if Ant does not exist
md "%HOMEDRIVE%\Apache\apache-ant-1.9.7\" 2>nul
:: Set filename variable
SET "FILENAME=%~dp0\apache-ant-1.9.7-bin.zip"

:: Download ANT from mirror
bitsadmin.exe /transfer "Apache Ant Download" http://mirrors.ukfast.co.uk/sites/ftp.apache.org//ant/binaries/apache-ant-1.9.7-bin.zip "%FILENAME%"

:: Copy Apache Ant to C:\Apache-Ant
xcopy "%~dp0apache-ant-1.9.7-bin.zip"  "%HOMEDRIVE%\Apache\."

:: Delete zip file from curent directory
del "%~dp0apache-ant-1.9.7-bin.zip"

:: Unzip Apache Ant to C:\Apache-Ant
call :UnZipFile "%HOMEDRIVE%\Apache\" "%HOMEDRIVE%\Apache\apache-ant-1.9.7-bin.zip"

:: Delete zip folder
del "%HOMEDRIVE%\Apache\apache-ant-1.9.7-bin.zip"

:: Set ANT_HOME path
set "ANT_HOME=%HOMEDRIVE%\Apache\apache-ant-1.9.7"
setx ANT_HOME "%HOMEDRIVE%\Apache\apache-ant-1.9.7" /m

:: Add ANT to path
set "path=%PATH%;%ant_home%"
setx path "%PATH%" /m

:ant197exists

....whatever whatever

goto :eof

:UnZipFile <ExtractTo> <newzipfile>
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%
goto :eof