9

たとえば、upgrade.bat などの Windows バッチ ファイルを実行したい場合、ソース ディレクトリからバッチ ファイルがあるディレクトリに多数のファイルをコピーします。問題は、コピーされたファイルの 1 つがアップグレードの新しいバージョンである可能性があることです。 .bat に変更して、バッチ ファイルがまだ実行中に自分自身を上書きするようにします。

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

4

7 に答える 7

7
@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%、元のバージョンが上書きされる可能性があります。

于 2013-06-19T03:03:12.203 に答える
6

そのためには、次の要件を満たす必要があります。

  • それ自体の新しいバージョンのバッチ ファイルの上書きは、バッチ ファイルの最後のコマンドである必要があるため、 の後の次のコマンドはまたはであるcopy必要があります。exit /Bexit
  • 以前のコマンドは、実行する前にメモリにロードする必要があります。これは、それらを括弧で囲むことによって簡単に実行できます。

あれは:

@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
)
于 2013-06-19T02:50:15.147 に答える
4

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%" .
于 2013-06-19T01:57:42.797 に答える
4
@echo off
cmd /c copy "C:\somepath\upgrade.bat" "%0" & %0

これにより、新しい cmd プロセスが開始され、現在のバッチ ファイルが「C:\somepath\upgrade.bat」に置き換えられ、バッチ ファイルが再起動されます。

于 2013-06-19T03:01:38.950 に答える
2

バッチ ファイルの新しいバージョンごとにバージョン サフィックスのタグを付け、2 つ目のバッチ ファイルをランチャーとして使用するオプションはありますか?

たとえば、ペイロード バッチ ファイルがupgrade.batで、後続のバージョンの名前が upgrade_001.bat、upgrade_002.bat、upgrade_003.bat .. または upgrade_201305122134 (接尾辞は yyyymmddHHMM) であるとします。新しいバッチ ファイルlauncher.batは、サフィックスが最も大きいものを探して実行することにより、最新のバッチ アップグレード ファイルを取得します。

于 2013-06-19T01:27:59.830 に答える