LoginSignup
5
7

More than 5 years have passed since last update.

powershellでWindowsタスクスケジューラのタスクを複数サーバから一括エクスポートする

Posted at

Windowsのタスクスケジューラをガリガリ運用していて、タスクを日次で定期的にバックアップしたいという要件があったのでやってみた。

Powershell2.0でも動くのが嬉しい(4.0とか使うと素敵なコマンドレットで操作出来そう!!)

経緯

GUIからだと全件選んでエクスポートとかは出来るけど、まさか毎日やるわけないし、昔からお馴染みのschtasksだと、タスク名を引数で渡してからのxml出力は出来るけど(これまではサーバリプレイスの時はこれをbatで組んでやってた)、毎回タスク名取ってきてコマンド生成するの辛いなとか思ってたさなか、同僚の一声でpowershellで簡単に出来そうってなったのでやってみた。

今回は、スタンバイ機からリモート経由でタスクを取得してくるという構成。

あんまpowerShell詳しくないけど、最近のpowershellだと、タスクスケジューラをいじくる用のコマンドレットも出てるみたいだけど、今回は、バージョンが最新でなかったのでComObject(Schedule.Service)に接続する方法で実現した。

今までbatでかなり辛い運用していたので、自分的には革命的だった!!

サンプルコード

  • srvListに入れたサーバ名毎に、フォルダを掘って登録タスク数分xmlファイルを出力
  • リストアは、batでやるもよし、GUIでやるも良し(xmlファイルさえ手元にあればOK)
task_export.ps1
#出力先パス
$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

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7