kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

C# Advent Calendar jp: 2010 12/22分

ちょっとタイムアップ気味なので、C# Advent Calendarの12/22分を書きます。
C# Advent Calendar jp: 2010 : ATND
Advent Calenderが何かという方はこちらの記事を。
本日12月1日より,プログラマ有志による技術系Advent Calendarが各所ではじまる:インフォメーション|gihyo.jp … 技術評論社
C#というか、.NETではなんといってもLINQでしょう。LINQ便利ですよね。XPathに自信がない私はこれがないとXML扱える気がしません。そして、Windows Vista/Windows Server 2008以降では実行タスクの一覧をXMLで出力できるようになりました。

C:\>schtasks /query /XML ONE

とかやると登録済みのタスクで現在の権限で閲覧可能なものが一つのXMLになって出力されます。これをLINQ to XMLでパースしてやろうじゃないかというのが本日のお題目です。

using System;
using System.Linq;
using System.Diagnostics;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

namespace AvendCalender
{
  public class TaskInfo
  {
    var schTasks = new Process();

    schTasks.StartInfo.Arguments = "/query /XML ONE ";
    schTasks.StartInfo.FileName = "schtasks.exe";

    schTasks.StartInfo.UseShellExecute = false;
    schTasks.StartInfo.RedirectStandardOutput = true;
    schTasks.Start();

    string xmlText = schTasks.StandardOutput.ReadToEnd();
    XDocument xtaskXml = XDocument.Parse(xmlText);
    schTasks.WaitForExit();
    schTasks.Close();

    XNamespace xnSchTasks = "http://schemas.microsoft.com/windows/2004/02/mit/task";

    var xmlTasks = from x in xTasksList.Root.Elements(xnSchTasks + "Task")
                           select x;
  }
}

これで各タスクがxmlTasks内に列挙されます。LINQというよりも標準コマンドの説明になってしまいましたが(^^;。コマンドの標準出力をうまく使って取り込めば便利ですよ!