2013-06-19 18 views
8

私はWindowsのバッチファイルを実行したいと言う、upgrade.batは、ソースディレクトリからバッチファイルが入っているディレクトリにたくさんのファイルをコピーします。問題は、コピーされたファイルの1つが新しいバージョンのアップグレードかもしれないということです。バットファイルが上書きされるので、バッチファイルはまだ実行中に上書きされます。安全に自分自身を更新するWindowsバッチファイルを取得する方法

これは、バッチファイルの実行が予期せぬ動作をするように思われるため、まだ実行中のバッチファイルをコピーしないようにしたいと考えています。理想的には、既存のバージョンのupgrade.batを実行して終了し、次回に新しいバージョンを実行するようにします。これを達成するための(簡単な)方法はありますか?

+2

実行する前にファイルの名前を変更しますか? – Chad

+0

@Chad - upgrade.batの内部からupgrade.batの名前を変更することを意味しますか?それが安全で予測可能な行動を起こすでしょうか? –

答えて

3

最後の操作としてコピーを実行するには、startコマンドを使用して別のターミナルから起動できます。この例、特に最後の行を確認してください。次の要件を満たさなければならない、それを行うためには

@echo off 
set CUR_FILE=batman.bat 
set FOUND_EQUAL="FALSE" 
set FROM_DIR=c:\temp\galeria\ 

SETLOCAL DisableDelayedExpansion 
FOR /R %FROM_DIR% %%F IN (*) DO (
    SET "p=%%F" 
    SETLOCAL EnableDelayedExpansion 
    SET ABC=!p:%FROM_DIR%=! 

    IF NOT !ABC! == !CUR_FILE! ( 
echo copying %%F 
    copy "%%F" . 
    )  
ENDLOCAL 
) 

echo trying to copy file with the same name [last operation] 
start copy "%FROM_DIR%%CUR_FILE%" . 
2

バッチファイルの各新しいバージョンにバージョンサフィックスを付けて、2番目のバッチファイルをランチャーとして使用することはできますか?例えば

がでUpgrade.bat であるあなたは、ペイロードバッチファイルであると言う、それ以降のバージョンではupgrade_001.bat、upgrade_002.bat、upgrade_003.bat ...またはupgrade_201305122134(接尾YYYYMMDDHHMMである)、新しいバッチファイルとして名前が付けられますlauncher.bat最新のバッチアップグレードファイルを探して、最も接尾辞の高いものを探して実行します。

+0

悪い考えではない、私はあなたがランチャーバッチファイルのアイデアを持っていると思う。 upgrade.batはソース管理されていますが、変更するたびに名前を変更するのは賢明ではありません。 –

4

  • 自体の新しいバージョンのためのバッチファイルの上書きは、バッチファイルの最後のコマンドでなければならないので、 copyの次のコマンドはexit /Bまたはexitでなければなりません。
  • 以前のコマンドは、実行する前にメモリにロードする必要があります。これはカッコで囲むことで簡単に行えます。

つまり:

@echo off 
rem Do program business here... 
echo Anything 

rem Parse/load following commands before execute they: 
(
rem Copy many files, probably a newer version of myself 
xcopy /Y *.* 
rem You may execute other commands here... 
echo Files copied! 
rem Terminate *this version* of the running Batch file 
exit /B 
) 
3
@echo off 
cmd /c copy "C:\somepath\upgrade.bat" "%0" & %0 

これは新しいCMDプロセスを開始し、 "C:\ somepath \でUpgrade.bat" と現在のバッチファイルを置き換えるだろうし、バッチファイルを再起動し

5
@ECHO OFF 
SETLOCAL 
IF /i NOT "%~dp0"=="%temp%\" (
COPY /y "%~dpnx0" "%temp%\%~nx0" >nul 
"%temp%\%~nx0" 

) 
ECHO Now we run the rest of the original UPGRADE.BAT 

upgrade.batの先頭にあるこの一連の行は機能するはずです。

%temp%のコピーから実行しているかどうかを確認してください。そうでない場合は、このファイルをtempにコピーして実行してください。

したがって、バッチは実際には%temp%から実行され、元のバージョンは上書きされる可能性があります。

+0

@Peter_Wright:これは面白そうだが、なぜ「ECHOでは元のUPGRADE.BATの残りを実行していない」...ファイルをコピーして実行した後に実行しますか? –

+0

@steveオリジナルを実行すると、ディレクトリは一時ディレクトリではないので、コピーがtempに作成され、実行され、実行がCOPYに転送されます。 COPYが実行されると、%0は一時ディレクトリにあります。つまり、コピーから元のコードを実行します(つまり、ECHOをオンにします)。今すぐあなたのORIGINALが '%temp%'にあれば、エラーは、それ自体の上にファイルをコピーしようとしているからです。 – Magoo

+0

@Peter_Wright:奇妙な構文を理解したら、とてもシンプルでエレガントです。私はそれをそこから実行して終了した後にtempから削除するように少し修正しました。 –

関連する問題