「ユーザーがログオンしている時のみ実行」では正常
「ユーザーがログオンしている時のみ実行」では正常に動作する。勿論、実行する条件のプログラム(BAT)は単体では問題なく動作する。なのに、この「ユーザーがログオンしているかどうかにかかわらず実行する」を付けた途端、動かなくなる。
原因は指定ユーザアカウントと不正文字
- 原因の一つは、BATコマンド内に指定しているネットワークドライブが原因の場合がある。ネットワークドライブはログインしているユーザプロファイル毎に作成される。つまり、PC自体(全ユーザ)に作成されるわけではないので、「ユーザーがログオンしているかどうかにかかわらず実行する」オプションを選択した場合、「タスクの実行時に使うユーザアカウント」で指定しているユーザ上で実行されるので、それが現在ログオンしているユーザと異なる場合、当然ネットワークドライブは無効になる。また、NAS等へのアクセスでも、そのユーザでのアクセス権限が無いと当然ながらアクセスできない。
- もう一つの原因は、BATファイルのフォルダ、またはファイル名に括弧()等の文字が有る場合は、タスクスケジューラ内部でカッコ文字が誤認識され、実行エラーを引き起こすようだ。
例:C:¥Hoge¥hoge(test)¥test(1).bat
上記のようなファイル名、パスだと、カッコ文字等の特殊文字が邪魔して(0x1)エラーとなる。
対策①、ネットワーク絶対パス
- ネットワークドライブの場合、ユーザを合わせるか、そのユーザでログオンした状態でネットワークドライブを作成しておく。または、単純にネットワークドライブではなく、ネットワーク絶対パスにする事で実行は可能。その指定ユーザでのアクセス権限がアクセス先に設定されているかも確認しておく。注意点としては、「ユーザーがログオンしているかどうかにかかわらず実行する」を選択するとバックグラウンドで実行される為、BATコマンドが走るコマンドプロンプトは表示されず、実行できていないように錯覚してしまう。一度、DOS画面で、コマンドを1つ一つ実行して確認する。ただし、当然だが対話式のコマンドは実行できない。
- ファイル名、パス文字に特殊な文字(全文字は検証出来てないが、ローマ字以外)が有る場合は、その特殊文字をやめるか、””で括る。
例:C:”¥Hoge¥hoge(test)¥test(1).bat”
因みに、コマンドオプション等は何も指定しなくても実行出来た。
対策②、Vista、2008環境で起こるバグ
Windows2008環境にて、タスクが「実行中」のまま終わらない現象。
ログを見てみるとBAT自体は完了しているのに、ステータスだけが「準備完了」に戻らない。
ググってみると、Vista、2008環境で起こるバグらしい。
http://support.microsoft.com/kb/2617046(リンク切れ)
このパッチで直りました。
因みに、再起動を求められますが、再起動しなくても症状はでなくなる。
対策③、タスクを終了させる
1回目は動くが、2回目になると動かない。
タスクマネージャを見ると、その動作しないタスクが残っている。
詳細タブのタスクを終了する時間を設定しても消えてくれない事があり、これは強制的に消すしかないので、別のタスクで、
taskkill /IM /T タスク名
をする事によって、正常に動作するようになった。
対策④、ネットワークドライブを設定
ネットワークドライブで実行すると、やはり0x4(ファイルが開けない)で異常終了してしまう。
そこで、BATに「NET USE」で先にネットワークドライブを切って実行すると正常終了するようになった。
ForFile等のコマンドで、絶対パスが使えない場合に有効。
NET USE /D Z: #←先にドライブを消しておいてやる
NET USE Z: UNCパス #/USER:等のオプション
対策⑤、設定プロパティー
BATを実行する場合、BATのみ登録してもダメなので、操作の編集→設定プロパティー画面にて、「/C」オプションをとバッチのフルパス+ファイル名を指定する。
プログラム、スクリプト(P):cmd
引数の追加(オプション)(A):/C BATのフルパス¥ファイル名.bat
開始(オプション)(T):BATのフルパス
※↑見やすくするため、記号の一部に全角文字を使用してます。
対策⑥、BATをプログラム、スクリプトに指定
対策⑤でローカルにあるBATを設定したのだが、何の反応がない。
内容はshutdownコマンドだけだっのだが・・・。
タスクにはCMDが常駐し、タスクスケジューラのステータスも実行中のまま。
悩んだ挙句、BATをプログラム、スクリプト(P)に指定するだけであっさりと実行してくれた。
対策⑦、カレントディレクトリを移動
BATを直接指定しても駄目な場合、通常であればタスクスケジューラの開始オプションでBATファイルのあるディレクトリを指定すればいい筈だったが、それでも駄目な場合、BAT内でカレントディレクトリを移動してやる必要があるようだ。ドライブが違うならドライブ移動も必要。
E:\hoge\Schedule.bat の場合
E:
CD E:\hoge
ここから実際のBATコマンド
|
|
対策⑧、XCOPYの場合
0x4エラーが出てしまう。
XCOPYの場合、オプションに
/h (隠しファイルやシステムファイルもコピー)
を付ける事で、0x4エラーはなくなり、正常終了するようになった。
単純にコマンドの不具合の場合があるので気を付けないといけない。
今回、フォルダ丸ごとコピーしたかったので、
/e /c /i /q /h /r /k /y /s
オプションを付けた。
例:xcopy /eciqhrkys C:\from C:\to
robocopyでも良いかもしれない。
例:robocopy コピー元 コピー先 /mir /np /ndl /fft
・オプション
/NP:コピーの完了率を表示しません。
/mir:ディレクトリ ツリーをミラー化します
/NDL:ディレクトリ名をログに表示しません。
FAT:ファイル時間 (2 秒の粒度) を仮定します。
考察
タスクスケジューラの実行結果(タスクを終了させて最新の情報に更新)と、実際の結果やコマンドプロンプトで実際のコマンドを1行1行確認をした方がいい。実は1行だけエラーになってたという言もある。また、実行結果はリアルタイムではない場合があるので、その都度「F5キー(最新の情報に更新)」を押して確認する必要がある。私は表示が自動更新されているとばかり思っていたので、時間になっても実行結果が表示されないので悩んだ経緯がある。
実行結果コード内容一覧
0x0:操作が正常に完了しました。
0x1:関数が正しくありません。
0x2:システムは、指定されたファイルを見つけることができません。
0x3:システムは、指定されたパスを見つけることができません。
0x4:システムは、ファイルを開くことができません。
同じ問題でずっと悩んでいましたが、記事で書かれている通りネットワークドライブから絶対パスに直したらうまく動作しました。ありがとうございました。
ちなみに、ログオン時に手動でタスクを実行しても、ネットワークドライブではNGのようです。
コメント有難うございます。
お役に立てたようで何よりです。
ネットワークドライブ設定で手動実行ができないのは不思議ですね・・・。
同じ問題で悩んでおりましたが、このブログの記事で納得できました。ありがとうございました。
コメント有難うございます。
お役に立てたようで何よりです。