連携 コントロールパネルのタスクスケジューラにbatファイルを登録

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

Option Explicit


Sub ShellATcmd()
'***********************************************************
'コントロールパネルのタスクスケジューラにbatファイルを登録
'***********************************************************
'バッチ.batファイルを登録する
'ATコマンド
'コントロールパネルのタスクスケジューラツール

Dim batPath(2) As String
Dim cmd(6) As String
Dim LogPath As String

Dim RetVal As Variant

'==================================================
'########################
'9:27に実行する
'########################
cmd(1) = "at "
cmd(2) = "9:27" '実行時刻
cmd(3) = " /"
cmd(4) = "interactive "
'実行され不必要になったタスクは自動で削除されます。

cmd(5) = "/next:10 "                'オプション[当日1回だけ実行-次の10日]
cmd(5) = "/next:10,20 "             'オプション[当日1回だけ実行-次の10日と20日]
cmd(5) = "/next:T "                 'オプション[当日1回だけ実行-次の火曜日]
cmd(5) = "/every:15 "               'オプション[当日永久実行-毎月15日]
cmd(5) = "/every:15,25 "            'オプション[当日永久実行-毎月15日と25日]
cmd(5) = "/every:S "                'オプション[当日永久実行-毎週土曜日]
cmd(5) = "/every:M,T,W,Th,F,S,Su "  'オプション[当日永久実行-毎日]
cmd(5) = ""                         'オプション[本日1回だけ実行]
'※日[Su]月[M]火[T]水[W]木[Th]金[F]土[S]
'==================================================

batPath(1) = """C:\Temp\ftptest.bat"""
batPath(2) = """C:\Temp\ftptest1.bat"""

'-----------------------------------------------------------------------
'【batファイルの実行】
'-----------------------------------------------------------------------
'タスクID取得及び実行
RetVal = Shell(batPath(1), 6) 'vbMinimizedNoFocus
'↑タスクID取得 ↑実行

If RetVal <> 0 Then
    MsgBox batPath(1) & vbCr & "実行されました。", vbInformation, "[タスクID]" & RetVal
Else
    MsgBox batPath(1) & vbCr & "実行出来ません。", vbCritical, "[ERROR]"
End If

'-----------------------------------------------------------------------
'【batファイルをタスクスケジューラに登録】
'-----------------------------------------------------------------------
'※注意:実行するたびに例え同じ内容でもタスクに登録されます。
'同じ内容の場合は1度限りの実行を行ってください。

'コマンド及び実行バッチパス
cmd(6) = cmd(1) & cmd(2) & cmd(3) & cmd(4) & cmd(5) & batPath(2)

'タスクID取得及びタスクスケジューラに登録
RetVal = Shell(cmd(6), 6)

If RetVal <> 0 Then
    MsgBox batPath(1) & vbCr & "タスク登録が実行されました。", vbInformation, "[タスクID]" & RetVal
Else
    MsgBox batPath(1) & vbCr & "タスク登録は実行出来ません。", vbCritical, "[ERROR]"
End If

End Sub

Mstask.exe(タスクスケジューラ)
  • 同一時刻に実行されるよう設定された 2 つのタスクが存在すると問題が発生することがあります。最初のタスクが正しく発行されると、[タスクを実行中] と表示されます。このとき次のタスクが実行されないと、最初のタスクの後処理が完了しないままとなります。タスクの状態が [タスクを実行中] と表示されているため、以後 Mstask.exe がタスクを実行しようとし続けても実行されません。
登録したタスクを削除する
C:\>at 1 /delete

登録したタスクエントリーを表示する
C:\>at
一覧にエントリが存在しません。
【AT コマンドの概要】
  • at コマンドを使用すると、コマンド、スクリプト、またはプログラムを指定した日時に実行するようにスケジュールできます。
  • このコマンドを使用して、既存のタスクを表示することもできます。
  • at コマンドを使用するには、タスク スケジューラ サービスが動作していて、ローカルの Administrators グループのメンバとしてログオンしている必要があります。
  • at コマンドを使用してタスクを作成する場合、タスクが同じユーザー アカウントで実行されるように、タスクを設定する必要があります。
【AT コマンド構文】
  • at \\computername time /interactive | /every:date,... /next:date,... command
    at \\computername time /interactive | /every:date,... /next:date,... command
       
    at \\computername id /delete | /delete/yes
    at \\computername id /delete | /delete /yes  
             
【AT コマンドパラメータ一覧】
\\computername
  • リモート コンピュータを指定する場合に使用します。
  • このパラメータを指定しなければ、タスクはローカル コンピュータ上で実行するようにスケジュールされます。
time
  • タスクの実行時刻を指定する場合に使用します。
  • 時刻は、24 時間制に基づき hours:minutes のように指定します。
  • たとえば、0:00 は真夜中、20:30 は午後 8:30 を表します。
/interactive
  • タスクの実行時にログオンしているユーザーのデスクトップとの対話を、タスクに許可する場合に使用します。
/every:date,...
  • タスクを指定した日付または曜日 (たとえば、毎週金曜日、毎月 8 日) に実行するようスケジュールする場合に使用します。
  • date には、1 つ以上の曜日 (省略形 M、T、W、Th、F、S、Su を使用)、または 1 つ以上の日付 (1 ~ 31 の数値を使用) を指定します。
  • 複数の日付を指定する場合は、必ずコンマで区切ります。
  • このパラメータを指定しなければ、タスクは現在の日付で実行するようにスケジュールされます。
/next:date,...
  • タスクを次の日付または曜日 (たとえば、次の月曜日) に実行するようスケジュールする場合に使用します。
  • date には、1 つ以上の曜日 (省略形 M、T、W、Th、F、S、Su を使用)、または 1 つ以上の日付 (1 ~ 31 の数値を使用) を指定します。
  • 複数の日付を指定する場合は、必ずコンマで区切ります。
  • このパラメータを指定しなければ、タスクは現在の日付で実行するようにスケジュールされます。
command
  • 実行する Windows 2000 コマンド、プログラム (.exe ファイルや .com ファイル)、またはバッチ プログラム (.bat ファイルや .cmd ファイル) を指定する場合に使用します。
  • コマンドで引数としてパスが必要な場合、絶対パス名 (ドライブ文字で始まるパス全体) を使用します。
  • コマンドがリモート コンピュータ上にある場合は、UNC (Uniform Naming Convention) パス名 (\\ServerName\ShareName) を使用します。
  • コマンドが実行可能ファイル (.exe) でない場合、たとえば、cmd /c copy C:\*.* C:\temp のように、コマンドの前に cmd /c を挿入します。
id
  • タスクに割り当てる ID 番号を指定する場合に使用します。
/delete
  • タスクをキャンセルする場合に使用します。
  • id パラメータを指定しない場合、コンピュータ上のすべてのタスクがキャンセルされます。
/yes
  • タスクのキャンセル時にシステムからの問い合わせすべてに yes (はい) と回答する場合に使用します。
  • このパラメータを指定しなければ、タスクのキャンセルを確認するダイアログ ボックスが表示されます。
注 : at コマンドを使用すると、システム アカウントの資格情報を使用してタスクが実行されます。
【タスクの作成方法】
  • [スタート] ボタンをクリックし、[プログラム]、[アクセサリ] を順にポイントし、[コマンド プロンプト] をクリックします。
  • コマンド プロンプトで次の行を入力し、Enter キーを押して、現在実行中のサービス一覧を表示します。
  • net start
  • 一覧にタスク スケジューラが表示されていない場合、次の行を入力し、Enter キーを押します。
  • net start "task scheduler"
  • コマンド プロンプトで次の行を入力し、Enter キーを押します (状況に応じて適切なパラメータを使用します)。
  • at \\computername time /interactive | /every:date,... /next:date,... command
例1
  • 夜間にすべてのファイルを Documents フォルダから MyDocs フォルダにコピーするには、次の行を入力し、Enter キーを押します。
  • at 00:00 cmd /c copy C:\Documents\*.* C:\MyDocs
例2
  • 平日の毎日午後 11:00 に Products サーバーをバックアップするには、バックアップ コマンドを含むバッチ ファイル (Backup.bat など) を作成します。
  • 次に、以下の行を入力し、Enter キーを押して、バックアップをスケジュールします。
  • at \\products 23:00 /every:M,T,W,Thu,F backup
例3
  • 午前 6:00 に Sales サーバー上で net share コマンドを実行するようにスケジュールし、出力結果を Corp サーバー上の Reports 共有フォルダの Sales.txt ファイルにリダイレクトするには、次の行を入力し、Enter キーを押します。
  • at \\sales 06:00 cmd /c "net share reports=d:\Documents\reports >> \\corp\reports\sales.txt"
タスクのキャンセル
  • [スタート] ボタンをクリックし、[プログラム]、[アクセサリ] を順にポイントし、[コマンド プロンプト] をクリックします。
  • コマンド プロンプトで次の行を入力し、Enter キーを押して、現在実行中のサービス一覧を表示します。
  • net start
  • 一覧にタスク スケジューラが表示されていない場合、次の行を入力し、Enter キーを押します。
  • net start "task scheduler"
  • コマンド プロンプトで次の行を入力し、Enter キーを押します (状況に応じて適切なパラメータを使用します)。
  • at \\computername id /delete | /delete/yes
  • ローカル コンピュータ上でスケジュールされているタスクをすべてキャンセルするには、at /delete と入力し、Enter キーを押します。
  • MyServer という名前のコンピュータ上のタスク ID 8 をキャンセルするには、at \\MyServer 8 /delete と入力し、Enter キーを押します。
【タスクの表示方法】
  • at コマンドを使用して作成したタスクを表示するには、以下の手順を実行します。
  • [スタート] ボタンをクリックし、[プログラム]、[アクセサリ] を順にポイントし、[コマンド プロンプト] をクリックします。
  • コマンド プロンプトで次の行を入力し、Enter キーを押して、現在実行中のサービス一覧を表示します。
  • net start
  • 一覧にタスク スケジューラが表示されていない場合、次の行を入力し、Enter キーを押します。
  • net start "task scheduler"
  • コマンド プロンプトで次の手順のいずれかを実行します。
  • at コマンドを使用してスケジュールしたタスクの一覧を表示するには、次の行を入力し、Enter キーを押します。
  • at \\computername
  • または
  • 特定のタスクを表示するには、次の行を入力し、Enter キーを押します。
  • at \\computername id
  • ローカル コンピュータ上のすべてのタスクを表示するには、at と入力し、Enter キーを押します。
  • Support という名前のコンピュータ上のタスクをすべて表示するには、at \\support と入力し、Enter キーを押します。
  • ローカル コンピュータ上のタスク ID 18 を表示するには、at 18 と入力し、Enter キーを押します。
【トラブルシューティング】
  • at \\computername と入力してタスクの一覧を表示したときに、at コマンドを使用して作成したタスクの一部 (または全部) が表示されません。
    • この現象は、at コマンドを使用してタスクを作成した後、[タスク] フォルダ内のタスクを修正した場合に発生することがあります。at コマンドを使用してタスクをスケジュールすると、そのタスクはコントロール パネルの [タスク] フォルダに表示されます。[タスク] フォルダでタスクを表示または修正することはできます。ただし、タスクを修正すると、at コマンドの使用時にタスクを表示できなくなります。
    • この現象を回避するには、タスクの表示または修正をコントロール パネルの [タスク] フォルダで行います。
    • タスク スケジューラ ツールで AT タスクを表示できない
  • at コマンドを使用してタスクをスケジュールしたときに、タスクが指定日時に実行されません。
    • この現象は、以下の状況のいずれかに該当する場合に発生することがあります。
    • コマンド構文が正しくありません。
    • タスクをスケジュールした後、at \\computername と入力し、構文が正しいことを確認します。コマンド ラインの下に表示された情報が間違っている場合は、タスクをキャンセルし、再作成します。
    • または
    • .exe ファイルでないコマンドを実行するようにタスクをスケジュールしています。
    • at コマンドは、コマンドの実行前に cmd (コマンド インタプリタ) を自動的に読み込みません。
    • .exe ファイルを実行する場合以外では、at cmd /c dir > c:\test.txt のようにコマンドの先頭で Cmd.exe を読み込む必要があります。
ヘルプを表示する
C:\>at /?
又は
C:\>help at
AT コマンドは、指定された日時にコマンドとプログラムがコンピュータで
実行されるようにスケジュールします。AT コマンドを使用するには、
Schedule サービスが実行中でなければなりません。

AT [\\コンピュータ名] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\\コンピュータ名] 時刻 [/INTERACTIVE]
   [ /EVERY:日付[,...] | /NEXT:日付[,...]] "コマンド"

\\コンピュータ名     リモート コンピュータを指定します。このパラメータを
                     省略したときは、ローカル コンピュータでコマンドが
                     スケジュールされます。
id スケジュールされたコマンドに割り当てられた識別番号です。
/delete              スケジュールされたコマンドを取り消します。
                     id を指定しなかったときは、コンピュータでスケジュール
                     されているすべてのコマンドが取り消されます。
/yes                 確認せずにすべてのジョブ コマンドを取り消すときに
                     使用します。
時刻 コマンドが実行される時刻を指定します。
/interactive         ジョブの実行中、ジョブはログオンしているユーザーの
                     デスクトップとの対話を許可します。
/every:日付[,...]    毎週指定した曜日に、または毎月指定した日にコマンドが
                     実行されます。
                     日付を省略したときは、その月の今日の日付が使用されます。
/next:日付[,...]     指定したコマンドが次の日付 (たとえば、次の火曜日) に
                     実行されます。日付を省略したときは、その月の今日の日付が
                     使用されます。
"コマンド"           実行する Windows NT コマンド、またはバッチ プログラム
                     です。

 

 

 

2000年01月01日|[VBサンプルコード]:[連携]