批处理文件 - 如果不存在不起作用
我有一个问题,我试图确定在尝试下载文件之前给定的目录是否存在于文件系统上。批处理文件 - 如果不存在不起作用
批处理文件:
:: 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语句被执行的地方不应该是?
由于
标签不是在块(括号内的一系列指令)
如果所需的md
将创建中间目录内允许的。
批量不知道程序。如果你call
是一个子程序,那么当子程序结束时(达到文件结尾或exit
)执行将返回call
- 如此:UnZipFile
与你的代码之后的指令。
将:unzipfile
例程移动到文件结尾,并在它之前直接插入goto :eof
,以确保代码不会流向:unzipfile
。
在:unzipfile
的末尾添加goto :eof
,以便稍后添加额外的代码(如更多子例程)。 goto :eof
具体是指“去物理结束文件”,它终止当前例程。
注意setx
不影响当前环境下,也不会影响现有cmd
的情况下,只有新cmd
的情况下,因此执行这两个set
和setx
。
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
感谢您的意见,但这仍然不能按我想要的方式工作。即使目录存在,脚本仍会尝试下载并解压缩该文件。 –
道歉 - 忽略我的评论,我运行错误的文件; /。也谢谢你解释几个位和bobs :) –
我不明白'IF'命令可能是错误的,但我确实看到了代码的另一个问题。您正在代码块中设置一个变量,但是您没有使用延迟扩展来在下一行代码中使用该变量。 – Squashman
@Squashman加入睡眠不是问题,但找出为什么该块执行,但它不应该?嗯 –
你在说什么。睡眠与我的评论无关。我正在谈论%filename%变量。当你在一个代码块中并且你设置了一个变量,并且你需要在该代码块中使用该变量时,你需要使用延迟扩展。 – Squashman