Windowsのタスクスケジューラをガリガリ運用していて、タスクを日次で定期的にバックアップしたいという要件があったのでやってみた。
Powershell2.0でも動くのが嬉しい(4.0とか使うと素敵なコマンドレットで操作出来そう!!)
経緯
GUIからだと全件選んでエクスポートとかは出来るけど、まさか毎日やるわけないし、昔からお馴染みのschtasksだと、タスク名を引数で渡してからのxml出力は出来るけど(これまではサーバリプレイスの時はこれをbatで組んでやってた)、毎回タスク名取ってきてコマンド生成するの辛いなとか思ってたさなか、同僚の一声でpowershellで簡単に出来そうってなったのでやってみた。
今回は、スタンバイ機からリモート経由でタスクを取得してくるという構成。
あんまpowerShell詳しくないけど、最近のpowershellだと、タスクスケジューラをいじくる用のコマンドレットも出てるみたいだけど、今回は、バージョンが最新でなかったのでComObject(Schedule.Service)に接続する方法で実現した。
今までbatでかなり辛い運用していたので、自分的には革命的だった!!
サンプルコード
- srvListに入れたサーバ名毎に、フォルダを掘って登録タスク数分xmlファイルを出力
- リストアは、batでやるもよし、GUIでやるも良し(xmlファイルさえ手元にあればOK)
# 出力先パス
$outPath = "D:\work\nagai\pstest"
# 対象サーバ名を配列で
$srvList = "サーバ名1","サーバ名2"
$outtask = "\"
$outFileName = "{0}.xml"
$sch = New-Object -ComObject("Schedule.Service")
foreach($srvName in $srvList){
$sch.Connect("$srvName")
$tasks = $sch.GetFolder("$outtask").GetTasks(0)
$outfile_temp = Join-Path $outPath -ChildPath $srvName | join-Path -ChildPath $outFileName
$tasks | ForEach-Object{
$outfile = $outfile_temp -f $_.name
$_.xml | Out-File $outfile
}
}
ps1スクリプトをタスクスケジューラにセット
ついでに、タスクスケジューラにpowershellをセットする際の「操作」タブの設定方法も
操作: プログラムの開始
プログラム/スクリプト: %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加: -Command ".\TaskExport.ps1"
開始: ps1を配置しているフォルダ
参考
https://gallery.technet.microsoft.com/scriptcenter/5af6451b-2e65-4349-bf9f-71e966a25a6f
http://mtgpowershell.blogspot.jp/2013/11/blog-post.html