2017-06-08 30 views
0

Windowsタスクスケジューラによって起動される.batファイルがかなりあります。そして、その後、またはプロセスで呼び出されたアプリケーションによって。後者の場合、アプリは起動したことを記録する.batファイルと、完了したログを記録する別の.batファイルを起動します。それらはすべてログファイルに書き込む別の単一ログ.batファイルをトリガーします。そこにそれらがオーバーラップさせ、複数の状況:自律型.batファイルを順番に実行するようにします。

をタスクスケジューラのタスクのすべてを手動で一度アプリのタスクの

1を実行している他の関連するタスク スケジューラは、スケジュール通りに実行したときにまだ実行されています。

そこで、我々は時々見:それは別の のプロセスによって使用されているので、

は、プロセスはファイルにアクセスすることはできません。

この結果、ログエントリが失われてしまいます。

ただ、明確にするために: タスクスケジューラのタスク:

GO1 >>>起動bat_name1.bat

GO2 >>>起動bat_name2.bat

など

bat_name1.bat、bat_name2.bat、....

CALL log.bat %bat_nameN% 
app.exe %bat_nameN% 
EXIT 

app.exeのタスク:nameN

がSTARTnameN.bat

は(APPのコアを実行する)起動

起動ENDnameN.bat

STARTnameN.batとENDnameN .bat

log.bat %nameN% 
だから、目標はすべてのこれらのプログラムは、自律的に実行するのではなく、ログファイルが完全に干渉せずに書き込むことができるので、結果をsequentializeできるようにするだろう

@ECHO OFF 
SET fileloc=C:\Users\Public\BackupLogs 
echo %time% %date% %2 %3 %~1>%fileloc%\temp.txt 
type %fileloc%\temp.txt>>%fileloc%\backuplog.txt 

log.bat 210

temp.txtをtempN.txtに分割し、その結果を終了プロセスの一部として単一のbackuplog.txtに追加することが考えられます。それはおそらく重なり合うかもしれないので、それをより良くするだろうが、100%の解決策ではないように思われるでしょうか?

+0

別々のtempN.txtログファイルの提案は良い方法ですが、あなたが言うように、オーバーラップする呼び出しを処理しません。バッチファイルが実行されるのを待つか、ファイルが存在する場合に終了するようなロッキングコードを書くことができます。複雑な環境では、これは難しく、永続的なメンテナンスの問題です。スケジューラーツールを検討することもできます。私はadTempus http://www.arcanadev.com/でいくつかの成功を収めました。私は唯一のユーザーであり、adTempusを選択した場合には恩恵を受けることはありません。 – lit

答えて

0

次のようなものを経由してAPPENDが失敗したかどうかをテストして、再試行できます(たとえば、エコーや種類などの内部コマンドはエラーレベルを設定していないだろうとしてコピーを使用する必要があります。)

:try_append 
copy /b %fileloc%\backuplog.txt+%fileloc%\temp.txt %fileloc%\backuplog.txt 
if errorlevel 1 goto try_append 

をこれで問題は改善されますが、%fileloc%\temp.txtファイルにはまだ衝突の問題があります。おそらく、さまざまな.batファイルの固有の一時名を使用して簡単に解決する方法があります。

もしそうでなければ、より良いランダムな一時ファイル名は%time :: =%(ミリ秒のランダム性)を使って作成できますが、おそらくそれも衝突する可能性があります。

本当にランダムなファイル名が必要な場合は、すべてのプロセッサクロックサイクルを変更して衝突を不可能にするRDTSCオペコードの値が関係します。これに役立つオープンソースのツールがあります(例:capture RDTSC opcode)。しかしおそらくそれは別の質問の話題です。

関連する問題