
1 日に 1 回だけ exe を実行するスケジュール タスクを設定しようとしています。次のことを試しました。
毎日午前 4 時にトリガーし、「スケジュールされた開始に失敗した後にできるだけ早くタスクを実行します」
この方法は、アカウントにパスワードが設定されていない場合には完璧に機能します。その場合、Windows は直接デスクトップを起動し、少し遅れてタスクが実行されます。
アカウントにパスワードを追加すると、タスクが実行されなくなりました。タスク履歴に警告が記録されています:
起動条件が満たされたときにユーザー「Y」がログオンしていなかったため、タスク スケジューラはタスク「X」を起動しませんでした。ユーザー操作: ユーザーがログオンしていることを確認するか、ユーザーがログオフしているときに起動できるようにタスク定義を変更してください。
これは愚かな警告のように思えます。「セキュリティ オプション」で「ユーザーがログオンしているときのみ実行する」を選択しました。なぜタスク スケジューラはユーザーがログオンする前にタスクを起動しようとするのでしょうか?
毎日午前 4 時にトリガーし、「ログオン時」にできるだけ早く実行します。
このアプローチは私が意図した効果をもたらさなかった。つまり、私が望んでいた両方条件が真である、つまり「毎日午前4時以降」が真で「ログオン」が真であればタスクを実行します。そして、その日の「ログオン」イベントごとに「毎日午前4時以降」が真でなくなるため、次の日まで待機します。残念ながら、これはタスクスケジューラの動作方法ではなく、このアプローチではタスクは毎ログオン。
ユーザーがログオンしているかどうかに関係なく実行する
実行しようとしている exe が完了時にユーザー入力を必要とすることがあるため、この方法は使用できません。一般に、このオプションを使用できない理由はさまざまです。
その他のオプション
必死の回避策として、ファイルに書き出して、以前に呼び出されたかどうかを検出できるバッチ スクリプトを作成することを検討しています。
この一見一般的で単純なスケジュールの使用例を実現するには、もっと良い方法が必ずあるはずです。
答え1
ログオン時に1日1回タスクを実行する
1 日に 1 回だけ exe を実行するスケジュール タスクを設定しようとしています。
ファイルに書き出し、以前に呼び出されたかどうかを検出できるバッチ スクリプトを作成することを検討しています。
さて、以下は、コメントで述べたように、直面している問題に応じて役立つ可能性がある、非常に基本的で単純なバッチ スクリプト ロジックの例です。
また、バッチ スクリプトの実行時にタスク スケジューラが期待どおりに動作しないというさらなる問題が発生した場合に備えて、タスク スケジューラに関する別の投稿 (この回答の下部) も参照します。構成で具体的に選択するオプションは OS と同様に異なる場合がありますが、このレベルの落とし穴はおそらく同じであるため、バッチ スケジューリングでタスク スケジューラが期待どおりに動作しない場合は、その投稿も簡単に確認してください。
基本的なスクリプトの内訳
ループは現在の日付に使用する変数
FOR /F
を作成します。YYYYMMDD
これは、毎日ファイル名の一部を含むこの小さなチェック ファイルを配置する
CheckDir
ローカル ドライブ パスまたは UNC パスです。\\servername\sharename\folder
YYYYMMDD
C:\Path
環境内で必要な場所にUNCパスを 変更するか挿入するだけです
は、先頭に が付き、末尾に が .txt 拡張子の前に追加された
checkfile
ファイル名のみです。たとえば、私の例のように、今日の最終結果は になります。%CheckDir%\
%DT%
C:\Path\VersionBackup_20130202.txt
- これは基本的に、今日のファイルが存在するかどうかを確認し、存在する場合はスクリプトを終了し、存在しない場合は作成して、EXE 名が何であれ VersionBackup.exe を実行します。このようにして、タスク スケジューラを使用して、バッチ スクリプトを指定して 1 時間に 1 回実行するようにスケジュールすることができ、バッチ スクリプトのロジックに従って、1 日に 1 回のみ実行できるようになります。
START "" "C:\Path\VersionBackup.exe"
バージョン バックアップ操作を実行する EXE 名が存在する完全なパスを指定するだけです。
バッチ スクリプトの例
@ECHO ON
:::: SET YYYYMMDD format for date
FOR /F "TOKENS=2-4 DELIMS=/ " %%A IN ("%DATE%") DO SET "DT=%%C%%B%%A"
:SetCheckFile
SET CheckDir=C:\Path
SET checkfile=%CheckDir%\VersionBackup_%DT%.txt
IF NOT EXIST "%CheckDir%" MD "%CheckDir%"
IF EXIST "%checkfile%" GOTO EOF
ECHO Creating the check file for date %DT% to ensure only one Version Backup run for the day>>"%checkfile%"
:StartApp
START "" "C:\Path\VersionBackup.exe"
GOTO EOF
答え2
コンピュータの起動時に .exe を実行するには、次のフォルダーのいずれかに .exe をドロップします。タスク スケジューラで何もする必要はありません。
現在のユーザーのみ:
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\スタート メニュー\プログラム\スタートアップ
すべてのユーザー向け:
C:\ProgramData\Microsoft\Windows\スタート メニュー\プログラム\スタートアップ
お役に立てれば!