2016-11-04 10 views
0

ファイルをダウンロードしようとする前にファイルシステムに特定のディレクトリが存在するかどうかを判断しようとしています。バッチファイル - 存在しない場合は動作しません。

バッチファイル:

:: 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

「IF」コマンドがどのように間違っているかはわかりませんが、コードに別の問題があります。コードブロック内に変数を設定していますが、次のコード行でその変数を使用するために遅延拡張を使用していません。 – Squashman

+0

@Squashmanは睡眠を増やすことは問題ではありませんが、ブロックはなぜ実行してはいけないのですか? hmm –

+0

あなたは何について話していますか?睡眠は私のコメントとは関係ありません。私は%filename%変数について話しています。コードブロック内にあり、変数を設定し、その変数をそのコードブロック内で使用する必要がある場合は、遅延拡張を使用する必要があります。 – Squashman

答えて

1

ラベルが必要な場合(括弧内の一連の命令)

mdは中間ディレクトリを作成しますブロック内で許可されていません

感謝。

バッチには手順がありません。 callサブルーチンの場合、サブルーチンが終了すると(ファイルの終わりまたはexitに達する)、実行はcall - :UnZipFileのコードの後の命令に戻ります。

:unzipfileルーチンをファイルの最後に移動し、コードが:unzipfileに確実に流入しないようにするために、その直前にgoto :eofを挿入します。
:unzipfileの末尾にgoto :eofを追加すると、後でさらにサブルーチンのようなコードを追加できます。 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 
+0

あなたのご意見ありがとうございますが、これは私がしたい方法ではまだ動作しません。ディレクトリが存在しても、スクリプトは引き続きファイルのダウンロードと解凍を試みます。 –

+0

apologies - 私のコメントを無視する、私は間違ったファイルを実行していた; /。また、いくつかのビットとボブを説明してくれてありがとう:) –

関連する問題