検索

カレンダー

2012年5月
« 4月    
 123456
78910111213
14151617181920
21222324252627
28293031  

広告

ブログランキング・にほんブログ村へ
にほんブログ村

東電電力供給情報

カテゴリー

最近のコメント

リンク

Windows Script Host(WSH)からtar32.dllを実行してtarファイルを圧縮・解凍する

投稿者:yasu 更新日時:2008年12月16日 18時44分00秒
カテゴリArchiver, Windows, WSH

Windowsのコマンドラインでバッチ処理を作るときに意外と困るのがファイルの圧縮・解凍で、Windows標準機能ではcabファイルしか取扱いできません。
WindowsXPやWindowsServer2003以降だとWindowsの標準機能でzipファイルの取扱いができるようになりましたが、それもエクスプローラ上などUIが必要でコマンドラインから圧縮・解凍可能なのはcabファイルだけです。
先日もサーバからダウンロードしたtar形式のファイルを解凍するバッチを作る事になったのですがWindowsの標準機能では解凍できません。
今回作成しようとしている、tarファイル解凍バッチはバッチ処理用サーバーOS上で動かす必要があり、安易にコマンドラインに対応している外部のアーカイバもインストールできません。
そこで試行錯誤した結果、吉岡 恒夫さんの作られたtar32.dllをWindows Script Host(WSH)で実行してtarファイルを解凍する方法をご紹介します。

まず今回作業するフォルダとして C:Worktar-test を作ります。

次に上記サイトのTAR32.DLL Ver2.xx(最新版) のDLL単体からtar32.dllをダウンロードして、C:Worktar-testフォルダに保存します。

次に適当に複数のファイルを圧縮したtar形式のファイルを準備してC:Worktar-testフォルダに保存します。
※圧縮するファイルは何でもいいです。

次にtar32.dllを実行してファイルを解凍するWSHを作ります。
C:Worktar-testフォルダにtar.jsというファイル名で保存します。

// WSH版tarコマンド
//
//  第一引数 オプション
// 第二引数 ファイル名
//
//

var objWshShell;
var objExecCmd;

if (funcParamCheck()) {
 try {
  objWshShell = WScript.CreateObject("WScript.Shell");
  objExecCmd = objWshShell.Exec("rundll32.exe C:\Work\tar-test\tar32.dll, TarCommandLine " + WScript.Arguments(0) + " " + WScript.Arguments(1));
 } catch(e) {
  WScript.ECho("tarコマンド失敗!");
 } finally {
  objWshShell = null;
  objExecCmd = null;
 }
}

function funcParamCheck() {

 if (WScript.Arguments.Unnamed.Length == 0) {
  WScript.Echo("オプションの指定がありません。");
  return false;
 }
 if (WScript.Arguments.Unnamed.Length == 1) {
  WScript.Echo("ファイルの指定がありません。");
  return false;
 }

 return true;

}

ポイントとしては[rundll32.exe]というdllを実行する実行ファイルを使ってtar32.dllを実行しtarファイルを解凍しています。
またコマンド実行時にパラメタとしてtarコマンドのオプションとファイル名を受け取りtarファイルの圧縮・解凍ができるようにしました。

ここまでの準備でC:Worktar-testフォルダにはtar.js、test.tar、tar32.dllの3つのファイルが格納されているかと思います。

さてtarファイルの解凍ですが、コマンドプロンプトから以下のように入力します。

 cd worktar-test
 cscript tar.js xzvf test.tar

これでtest.tarファイルが解凍されたはずです。

またこの解凍したxmlファイルを別のtarファイルで再圧縮する場合は

 cd worktar-test
 cscript tar.js cvf "xml.tar *.xml"

これでxml.tarファイルができあがりました。

この後tar.jsの第一パラメタに「tvf」を渡してファイルの一覧を表示しようと思ったのですが、一覧は返ってきませんでした。

原因はわからなかったのですが、恐らくrundll32.exe経由でtar32.dllを実行している為だと思われます。
正しく圧縮できたか任意のアーカイバでtarファイルの中を参照して確認してみてください。

今度はWindowsXPやWindowsServer2003以降のWindowsOSで標準搭載されているzipファイルの圧縮・解凍をWSHで実装してみたいと思います。
恐らく今回同様rundll32.exeを使ってできるのではないかと思いますが、それは次回のお楽しみということで。

でわ!

サイボウズのスケジュールをWindows Mobile(Advanced/W-ZERO3 [es])に自動同期した時の削除済みアイテムに残った予定を自動削除する

投稿者:yasu 更新日時:2008年12月8日 19時06分00秒
カテゴリMobile, WSH

前回サイボウズのスケジュールをOutlook2003を経由してWindows Mobile(Advanced/W-ZERO3[es])に自動同期する方法をご紹介しましたが、手順6でご紹介したWSHだとOutlookの削除済みアイテムに削除した予定が残ってしまっておりました。
OutlookはあくまでサイボウズとWindows Mobile(Advanced/W-ZERO3[es])のスケジュール橋渡し的な用途としているので、この際WSHで削除済みアイテムも全削除したいと思います。
※Outlookをメインのメーラーとして使われている方は削除済みアイテムが空になってしまいますので、導入しない方がいいかもしれません。

// 定数宣言
var olSave = 0;
var olAppointmentItem = 1;
var olFolderDeletedItems = 3;
var olFolderCalendar = 9;

var adTypeText = 2;
var adCRLF = -1;
var adReadLine = -2;

var strFileName = "C:\cybozu2ical-0.32\Cybozu.ics";

var strBuf;
var intReadFlg;
var strStartDate;
var strStartTime;
var strEndDate;
var strEndTime;
var strTitle;
var strBody;
var strBreakStartDate = "0";
var strBreakStartTime = "0";
var strBreakEndDate = "0";
var strBreakEndTime = "0";
var strBreakTitle = "0";
var strBreakBody = "0";

// Outlook用オブジェクト
var objOl = new ActiveXObject("Outlook.Application");
var objNs = objOl.GetNamespace("MAPI");
var objFd = objNs.GetDefaultFolder(olFolderCalendar);
var objDust = objNs.GetDefaultFolder(olFolderDeletedItems);
var objItems = objFd.Items;
var objDItems = objDust.Items;
var objAppo;

try {
 // 予定表を全削除
 var i = 1;
 while (objItems.Count >= i) {
  objAppointment = objItems(i);
  if (getYYYYMMDD(String(objItems(i).Start)) < getYYYYMMDD()) {
   i++;
  } else {
   objItems(i).Delete();
   objItems = objFd.Items;
   i = 1;
  }
 }

 // 削除済みアイテム全削除
 objDItems = objDust.Items;
 while (objDItems.Count >= 1) {
  objDItems(1).Delete();
  objDItems = objDust.Items;
 }

 // iCalファイルを読込み、予定表に書込み
 intReadFlg = 9;

 var objStream = OpeniCalFile(strFileName);
 do {
  strBuf = objStream.ReadText(adReadLine);

  if (strBuf == "BEGIN:VEVENT") {
   intReadFlg = 1;
  } else if (strBuf == "END:VEVENT") {
   intReadFlg = 0;
  } else if (strBuf == "BEGIN:VTIMEZONE") {
   intReadFlg = 9;
  }

  if (intReadFlg == 1) {
   // 予定開始日
   if (strBuf.indexOf('DTSTART;TZID=Asia/Tokyo', 0) >= 0) {
    strStartDate = strBuf.substring(strBuf.indexOf(":", 0) + 1, strBuf.indexOf("T", strBuf.indexOf(":", 0) + 1));
    strStartTime = strBuf.substring(strBuf.indexOf("T", strBuf.indexOf(":", 0)) + 1);
   } else if (strBuf.indexOf('DTSTART;VALUE=DATE', 0) >= 0) {
    strStartDate = strBuf.substring(strBuf.indexOf(":", 0) + 1);
   }
   // 予定終了日
   if (strBuf.indexOf('DTEND;TZID=Asia/Tokyo', 0) >= 0) {
    strEndDate = strBuf.substring(strBuf.indexOf(":", 0) + 1, strBuf.indexOf("T", strBuf.indexOf(":", 0) + 1));
    strEndTime = strBuf.substring(strBuf.indexOf("T", strBuf.indexOf(":", 0)) + 1);
   } else if (strBuf.indexOf('DTEND;VALUE=DATE', 0) >= 0) {
    strEndDate = strBuf.substring(strBuf.indexOf(":", 0) + 1);
   }
   // タイトル
   if (strBuf.indexOf("SUMMARY:", 0) >= 0) {
    strTitle = strBuf.substring(strBuf.indexOf(":", 0) + 1);
   }
   // 内容
   if (strBuf.indexOf("DESCRIPTION:", 0) >= 0) {
    strBody = strBuf.substring(strBuf.indexOf(":", 0) + 1);
   }
  } else if (intReadFlg == 0) {
   if (strStartDate >= getYYYYMMDD()) {
    if (strBreakStartDate != strStartDate || strBreakStartTime != strStartTime
    || strBreakEndDate != strEndDate || strBreakEndTime != strEndTime
    || strBreakTitle != strTitle || strBreakBody != strBody) {
     objAppo = objOl.CreateItem(olAppointmentItem);
     if (strStartTime != "") {
      objAppo.Start = getYYYYsMMsDD(strStartDate) + " " + getHHMMSS(strStartTime);
     } else {
      objAppo.Start = getYYYYsMMsDD(strStartDate);
     }
     if (strEndTime != "") {
      objAppo.End = getYYYYsMMsDD(strEndDate) + " " + getHHMMSS(strEndTime);
     } else {
      objAppo.End = getYYYYsMMsDD(strEndDate);
     }
     objAppo.Subject = strTitle;
     objAppo.Body = strBody;
     objAppo.ReminderSet = false;

     objAppo.Close(olSave);

     strBreakStartDate = strStartDate;
     strBreakStartTime = strStartTime;
     strBreakEndDate = strEndDate;
     strBreakEndTime = strEndTime;
     strBreakTitle = strTitle;
     strBreakBody = strBody;
    }

    strStartDate = "";
    strStartTime = "";
    strEndDate = "";
    strEndTime = "";
    strTitle = "";
    strBody = "";
   }
  }
 } while(strBuf != "END:VCALENDAR")
 objFile.Close();

} catch (ex) {
} finally {

 if (objStream) objStream = null;
 objDItems = null;
 objItems = null;
 objDust = null;
 objFd = null;
 objNs = null;
 objOl = null;
}

function OpeniCalFile(pFileName) {
 var objStream = new ActiveXObject("ADODB.Stream");
 objStream.Type = adTypeText;
 objStream.Charset = "UTF-8";
 objStream.LineSeparator = adCRLF;
 objStream.Open();
 objStream.LoadFromFile(pFileName);

 return(objStream);
}

function Now() {
 var today = new Date();
 return(today);
}

function getYYYYMMDD(strDate) {
 var today;

 if (strDate) {
  today = new Date(strDate);
 } else {
  today = new Date();
 }
 return(today.getFullYear().toString() + Right("0".toString() + (today.getMonth() + 1), 2).toString() + Right("0".toString() + today.getDate(), 2).toString());
}

function getYYYYsMMsDD(strDate) {
 return(strDate.substring(0, 4) + "/" + strDate.substring(4, 6) + "/" + strDate.substring(6, 8));
}

function getHHMMSS(strTime) {
 return(strTime.substring(0, 2) + ":" + strTime.substring(2, 4) + ":" + strTime.substring(4, 6));
}

function Right(str, n) {
  l = str.length;
  if (n > l) n = l;

  return(str.substring(l - n, l));
}

以前作ったc2o.jsを今回ご紹介したコードに置き換えてください。

これで削除済みアイテムに削除された予定が残らなくなりましたね。