Windowsでcronみたいな事をやらせる
お詫び
Qiitaの元記事にて、区切り線を「---」で書いている場所があり、これがZennの記法に干渉して一部うまく表示できない記事がある事を認識しています。
全ての記事を精査しきれていないため、お手数ですがお見かけの際は教えていただけると大変喜びます。
掲題の要望自体はタスクスケジューラを使えばできます。
ここではwindowsバッチで書いてますが、exeに引数渡していい感じに使えるならそうしましょう。
やりかた
windowsスタートメニュー
→全てのプログラム
→アクセサリ
→システムツール
→タスクスケジューラ
タスクスケジューラライブラリ上で右クリックし、基本タスクを作成します。
1.名前。なんでもいいです
2.トリガー。見たままです。ここではテストをするので、リアルタイムに近い場所を設定しておきましょう。
3.操作。プログラムの開始→それぞれ設定します。デスクトップにショートカット張ってプロパティ設定して動いたらそれを入れてください。
4.実際に動くことを確認してください。
5.動くことを確認できたらトリガーを指定時間にします。
使用例
たとえば、お子さまにパソコンを使わせたいけど、時間を過ぎたら強制的に落として寝かせる、という運用を考えた場合、以下の運用をするといいです。
まずはお子さまがパソコンを使うためには、親がログインしてあげるという運用対処を行います。(ここでは説明を省略します)
次に強制的にマシンを落とすものを作りましょう。
shutdown -s -t 0
これは、実行すると即時シャットダウンをします。
動かすときは他のプログラムが起動していないことを確認してください。
念のため、テスト用のファイルを置いておきます。
echo "実行完了"
pause
タスクスケジューラからtest.batのフルパスを設定して、実行完了が表示されれば成功です。
shutdown.batにパスを変えて、そちらも動くことを確認してみましょう。
(実行したらパソコンが落ちますので、他のアプリケーションは終了させておきます)
応用編
というか本編。
同じようにファイルを定期的にバックアップする仕組みを作っておきます。
gitとかsvnが出てる中でこんなアホな事をするのはどうなんだ?と思うんですが、サードパーティーを入れられない環境もあります。
前時代的ではありますが、いつか困るだろうなので備忘録として残してます。
rem batで実行。powershellなり他のが使えるならその方がいい。
rem 宗教戦争になるが、よく分からない場合はperlオススメ
@echo off
if "%~1" == "download" goto download
if "%~1" == "upload" goto upload
exit
rem dateで取得する時にファイル名に使えないアレコレをYYYYmmddにする
set day=%date:~0,4%%date:~5,2%%date:~8,2%
set backupfromF="バックアップ元フォルダ"
set backuptoF="バックアップ先フォルダ"
rem バックアップ先を日付管理などで保存。いい感じに改変推奨
:download
mkdir %backuptoF%\%day%
xcopy /e %backupfromF% %backuptoF%\%day%
exit
rem バックアップ元に復元する。こっちは特に意識していない
:upload
xcopy /e %backuptoF%\%day% %backupfromF%
exit
注意、というか忠告
タスクスケジューラやcronでrmコマンドを実施するのは心底おススメしません。
renameとかmvで保持しておいて、本当に削除して大丈夫なのか、確認しましょう。
大事なことなのでもう一度
batでやるならshell系使える環境を作って、そっちでやった方がいいと、個人的には思います。
Windowsならpowershellとか、そういうのを使うと文字列処理などでぐぬぬする事が比較的少ないと思います。
[2017/11/30] 別解 Windows Subsystem for Linux
この記事を見ている人はLinuxに慣れてる人だと思うので、こういうのはアリだと思います。
クライアントがWindows10 Pro版だよ~って人はこっちが断然オススメ!
[2021/12/07] 別解 Windows Subsystem for Linux
WSLにcron入れる必要なくね?という当たり前の事に当時気付きませんでした。
「これ(batからshellファイルを実行させる)をするんだ!」という目線で考えると視野が狭まって良くないですね。。
読了後いいね!をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Discussion