スクリプトのページ

最終更新日 2017/4/11 夢カウンタ


サンプルは個人的な好みのため基本的にJScriptです。内容は私のWindows XP Pro, Vista Ultimateなどで試した結果ではありますが環境に依存します。うまく動かなかったら連絡くれれば何とかなるかも!?
使い勝手を良くする
SKLogin.js 2003/2/3 ネットワークのログインなどの入力を簡単にするWSH JScriptです。
DelayKaspersky.js 2007/7/14 セキュリティソフト カスペルスキーの起動を遅らせるWSH JScriptです。その目的は本文を参照して下さい。
Rot13input.wsf 2006/2/25 1バイト英字を13文字ずらして表示するWSHスクリプトです。結果はCtrl+Cでコピーできます。
FullPath.wsf 2003/2/6 ファイルやフォルダをドロップするとフルパスを表示するWSHスクリプトです。Ctrl+Cでコピーできます。
FullPathA.js 2003/2/6 ファイルやフォルダをドロップするとフルパスを表示し、クリップボードにコピーするWSH JScriptです。フリーソフトのインストールが必要ですが、上のより一歩進んでます。
HelpView.js 2003/2/15 コンパイル済みヘルプファイルを開く際にフォントサイズとウィンドウを設定するWSH JScriptです。フリーソフトを使います。こんなこともできます、というサンプルです。
FolderOpen.js 2004/2/27 エクスプローラでフォルダを開くときに、ウィンドウの位置と大きさを設定するWSH JScriptです。フリーソフトを使います。パラノイア向け?
RunClipboard.hta 2006/10/6 クリップボードの内容を実行するHTMLアプリケーションです。今回、デスクトップのファイルが実行できなかったのを訂正しました。
ZZdel.js 2003/2/22 Windows Tempフォルダの中身を消すWSH JScriptです。Tempフォルダ名を環境変数tempから求めます。
MS Office
WordReplace.js 2004/7/18 Microsoft Wordドキュメントの文字列を置換するWSH JScriptです。世界中にそのものズバリのサンプルがないようなのでアップしてみました。
ExcelReplace.js 2004/7/18 Microsoft Excelドキュメントの文字列を置換するWSH JScriptです。世界中にありがちなものですけれども、私だったらこう作ります。
ExcelDateInput.js 2006/10/31 Microsoft ExcelのInputBoxを使用して日付を入力要求/チェックするWSH JScriptです。何かの部品に使えるかもしれません。せっかくなので自分の誕生日を入れられるようにしました。
emlファイル
emlReuse.js 2006/12/17 emlファイルをドロップする、又は送ると、emlファイルの内容を再使用してOutlook Expressを編集の状態で開きます。今回、2006年12月のWindows Updateの情報を追加しました。このスクリプトも意味がなくなりましたが、記念に残します。
emlTime.js 2008/4/26 emlファイルのタイムスタンプをヘッダのReceived又はDateに合わせます。コマンドラインツールFTIMEが必要です。今回、フォルダをドロップできるようにしました。など
emlMove.js 2008/11/24 emlファイルをファイル名が重複しないように移動します。ファイル名が重複した場合は自動的に番号(1),(2),(3)…を付加します。
Windows Liveメール
WLPrint.vbs 2009/12/6 Microsoft Windows Liveメールのメール本文を一括して印刷するWSH VBScriptです。内容ははOEPrint.vbsと同じです。
Vista Windowsメール
WMPrint.vbs 2009/12/6 Vista Windows メールのメール本文を一括して印刷するWSH VBScriptです。内容ははOEPrint.vbsと同じです。
Outlook Express
OEDownCount.js 2004/2/17 Microsoft Outlook Express 6のニュース読み取りの、1度に取得するヘッダー数の最大は1000に制限されています。この数を増やすWSH JScriptです。新しいニュースグループを読むときに便利かもしれません。
OEPollMail.vbs 2006/6/4 Microsoft Outlook Express 6の新着メッセージチェックの時間を制限するWSH VBScriptです。実際はOEから設定するのがよいと思いますが、技術的な興味から作ってみました。
OEPrint.vbs 2007/7/1 Microsoft Outlook Express 6のメール本文を一括して印刷するWSH VBScriptです。エコに逆行しているような気もしますけれども需要があるようです。
OECompact0.js 2004/9/26 Microsoft Outlook Express がWindowsXP SP2で100回ごとにフォルダの最適化を行うようになりました。このカウンタを0にして勝手に最適化させないようにするWSH JScriptです。
OECompactDlg.js 2006/12/17 Microsoft Outlook Express がWindowsXP SP2で100回ごとにフォルダの最適化を行うようになりました。初回に出てくる問い合わせメッセージを再表示するようにレジストリを書き換えるWSH JScriptです。今回、2006年12月のWindows Updateの情報を追加しました。
DBXSizeCheck.js 2006/5/20 Microsoft Outlook Expressのメッセージを記録しているDBXファイルのサイズをチェックするWSH JScriptです。説明で、サイズが大きくなると危険であることを強調しました。
パソコンの管理など
EventCheck.js 2004/7/4 Windowsのイベントログをフィルタして参照するWSH JScriptです。Windows2000,XPのAdministrator権限で実行します。Windows NTでも前提を満たせば動きます。
Pflog2csv.js 2004/10/22 Microsoft Windows XP SP2のFirewallログを参照するWSH JScriptです。
ShortcutKey.js 2008/9/6 Windowsのプログラムやフォルダのショートカットに設定したショートカットキーの一覧をExcelに表示するWSH JScriptです。
実験WMI 2006/4/14 ワークグループ内のWindows XP Pro SP2同士で、WMIのリモート操作を行う(別のコンピュータに接続する)実験です。ワークグループの場合ForceGuest=0が重要なようなので説明順を変えました。
実験WshRemote 2005/10/23 ワークグループ内のWindows XP Pro SP2同士で、WSHのリモート操作を行う(別のコンピュータにスクリプトを送って実行する)実験です。少し説明を加えました。
実験BinaryFile 2011/1/9 Outlook ExpressのDBXファイル内のメール数の表示、要はバイナリファイルを読み込んで表示するスクリプトをVBScriptとPowerShellで書いてみました。
touchNow.js 2016/11/15 フォルダ/ファイルの更新日時を現在の時刻にするスクリプトです。WSH JScriptからPowerShellを呼び出します。ファイル名中の引用符などの扱いを追記しました。
touchNow.bat 2017/4/11
Update!!
フォルダ/ファイルの更新日時を現在の時刻にするバッチファイルです。ドロップするファイル名にUnicodeの結合文字の濁点、半濁点があっても使えます。2バイト空白問題を対策しました。
会社関係
SKReminder.js 2004/4/18 退社時間の登録を忘れないようにするためのWSH JScriptと、その設定方法です。 WinXP、Win2000用。

SKLogin.js

ネットワークのログインなどの入力を簡単にするWSH JScriptです。

たとえば下のようなダイアログが出てきたときにキー操作一発で入力できます。「パスワードを記憶させ方が簡単じゃん!」というのは反則とします。(笑)


SKLogin.lzhをダウンロード、解凍し、ユーザID、パスワードを書き込んで下さい。更にショートカットを作ってスタートメニューのどこかに置き、キーボードショートカットを割り当てます(あぁ、文字で書くとややこしい)。キーボードショートカットの割り当て方法はMicrosoftのサイトを参照しましょう。Windows98,NT,2000も同様にできます。

マイクロソフト サポート技術情報 - 310417 Windows XP でプログラムにキーボード ショートカットを割り当てる方法

Rot13関数は必ずしも必要ありませんが、スクリプト中にパスワードがそのまま見えたらいやですよね。気にならない人はそのまま記述してSendKeysしてもOK。

Rot13関数に記述する文字列は別掲のRot13input.wsfスクリプトで作成できます。

ダイアログが出たときにキーボードショートカットを押すと一発で入力できます。

// SKLogin.js - ネットワークログイン
//
//                  Copyright(C) 2001 A.Shimada
//                                    2001.1.29

var Wsh = WScript.CreateObject("WScript.Shell");

Wsh.AppActivate (" に接続");      // ウィンドウタイトル後方一致

WScript.Sleep(100);
Wsh.SendKeys ("xxxxxxxxx");       // ★ユーザIDを記述する
WScript.Sleep(300);
Wsh.SendKeys ("{TAB}");
WScript.Sleep(300);
Wsh.SendKeys (Rot13("xxxxxxxx")); // ★Rot13(下記参照)したパスワードを記述する
WScript.Sleep(300);
Wsh.SendKeys ("{enter}");

// Rot13 - アルファベットを13文字ずらす関数
//
// 繰り返すと元に戻る。アルファベットでない文字はそのまま。
// ex. Hoge1hoge2 → Ubtr1ubtr2 → Hoge1hoge2
//
// Copyright(C) 2001 A.Shimada

function Rot13(str){
var i, c, s="" ;
var Lower="nopqrstuvwxyzabcdefghijklm";
var Upper="NOPQRSTUVWXYZABCDEFGHIJKLM";
for (i=0; i<=str.length-1; i++){
  c=str.substr(i,1);
  if (("a"<=c) & (c<="z"))
    s += Lower.substr(c.charCodeAt(0)-97,1); // 97="a"
  else if (("A"<=c) & (c<="Z"))
    s += Upper.substr(c.charCodeAt(0)-65,1); // 65="A"
  else
    s += c;
};
return(s);
}

DelayKaspersky.js

セキュリティソフト カスペルスキーの起動を遅らせるWSH JScriptです。

セキュリティソフトの試用版をいくつか試し、ジャストシステム販売のカスペルスキーが気に入って使っているのですけれども、タスクバーの通知領域(タスクトレイ)のアイコンが減っているのに気づきました。(苦笑) 根本対策はアイコンが出てこないソフトの改善(通知領域アイコン登録のタイムアウトを考慮)だと思いますが、タイムアウトが起きやすくなったのはカスペルスキーが忙しいせいでしょう。それならカスペルスキーの起動を遅らせればよいだろうと考えてスクリプトを作りました。当然ジャストシステム非公認です。(笑) もっと良い設定があるかもしれません。

DelayKaspersky.lzhをダウンロード、解凍し、スタートアップフォルダに入れます。なお、カスペルスキーの[設定]-[プロテクション]画面で[システム起動時にカスペルスキーインターネットセキュリティを実行する]チェックを外しておきます。

Windows XP + Kaspersky Internet Security 6.0で確認しています。
// DelayKaspersky.js - Kasperskyの起動を遅らせる
//
// [設定]-[プロテクション]画面の下記のチェックを外しておきます。
// [システム起動時にカスペルスキーインターネットセキュリティを実行する]
//
// Copyright(C) 2007 A.Shimada
//
// 2007/7/14  作成

var Wsh = WScript.CreateObject("WScript.Shell");
WScript.Sleep(10000);
Wsh.Run("\"C:\\Program Files\\Kaspersky Lab\\Kaspersky Internet Security 6.0\\avp.com\"", 2);

Rot13input.wsf

1バイト英字を13文字ずらして表示するWSHスクリプトです。結果はCtrl+Cでコピーできます。


SKLogin.jsなどで使用しているRot13関数で記述する文字列を作れます。
Rot13input.lzhをダウンロード、解凍して下さい。
<JOB>
<COMMENT>
  Rot13input.wsf - アルファベットを13文字ずらした文字列を表示する

  Copyright(C) 2002 A.Shimada
  2002/5/19 作成
</COMMENT>
<SCRIPT LANGUAGE="VBScript">
  function prompt(sPrompt,sTitle,sDefault)
    prompt = inputbox(sPrompt,sTitle,sDefault)
  end function
</SCRIPT>
<SCRIPT LANGUAGE="JScript">
  var result="";
  result = prompt("文字列を入力して下さい。\n\n"+
                  "1バイト英字を13文字ずらして表示します。","Rot13","");
  if (typeof(result)=="string" && result!=""){
    prompt("1バイト英字を13文字ずらした結果です。","Rot13",Rot13(result));
  }

  // アルファベットを13文字ずらす関数
  //
  // 繰り返すと元に戻る。アルファベットでない文字はそのまま。
  // ex. Hoge1hoge2 → Ubtr1ubtr2 → Hoge1hoge2
  //
  // Copyright(C) 2001 A.Shimada
  function Rot13(str){
  var i, c, s="" ;
  var Lower="nopqrstuvwxyzabcdefghijklm";
  var Upper="NOPQRSTUVWXYZABCDEFGHIJKLM";
  for (i=0; i<=str.length-1; i++){
    c=str.substr(i,1);
    if (("a"<=c) & (c<="z"))
      s += Lower.substr(c.charCodeAt(0)-97,1); // 97="a"
    else if (("A"<=c) & (c<="Z"))
      s += Upper.substr(c.charCodeAt(0)-65,1); // 65="A"
    else
      s += c;
  };
  return(s);
  }
</SCRIPT>
</JOB>


FullPath.wsf

ファイルやフォルダをドロップするとフルパスを表示するWSHスクリプトです。Ctrl+Cでコピーできます。


FullPath.lzhをダウンロード、解凍して下さい。
// FullPath.wsf - フルパスを得る
//
//                             Copyright(C)2002 A.Shimada

<JOB>
<SCRIPT LANGUAGE="VBScript">
Function Prompt(sPrompt,sTitle,sDefault)
  Prompt = InputBox(sPrompt,sTitle,sDefault)
End Function
</SCRIPT>

<SCRIPT LANGUAGE="JScript">
var Wsh = WScript.CreateObject("WScript.Shell");
var Arg = WScript.Arguments;
var Dummy;

if (Arg.length==0) {
  Wsh.Popup("フルパスを求めたいファイル又はフォルダをドロップして下さい。\n"+
            "ショートカットをSendToフォルダに入れて送るようにすると便利です。");
  WScript.Quit();
}

Dummy = Prompt("指定されたファイル又はフォルダ","フルパスを得る",Arg(0));

</SCRIPT>
</JOB>

FullPathA.js

ファイルやフォルダをドロップするとフルパスを表示し、クリップボードにコピーするWSH JScriptです。

あらかじめAutoItXというフリーソフトをインストールする必要があります。ダウンロード〜インストールの説明はこちら

FillPathA.lzhをダウンロード、解凍して下さい。
// FullPathA.js - フルパスを得る AutoItX活用バージョン
//
//                             Copyright(C)2003 A.Shimada

var Wsh = WScript.CreateObject("WScript.Shell");
var Aix = WScript.CreateObject("AutoItX.Control");
var Arg = WScript.Arguments;
var SecToWait=5;                      // 5秒で消す
var MB_OK=0, MB_ICONINFORMATION=64;

if (Arg.length==0) {
  Wsh.Popup("フルパスを求めたいファイル又はフォルダをドロップして下さい。\n"+
            "ショートカットをSendToフォルダに入れて送るようにすると便利です。");
  WScript.Quit();
}

Aix.ClipPut (Arg(0));

Wsh.Popup("クリップボードにコピーしました。\n\n"+Arg(0),SecToWait,
          "フルパスを得る",MB_OK+MB_ICONINFORMATION);

HelpView.js

コンパイル済みヘルプファイルを開く際にフォントサイズとウィンドウを設定するWSH JScriptです。フリーソフトを使います。こんなこともできます、というサンプルです。

よく使うHTMLヘルプファイルのフォントサイズ、ウィンドウの位置と大きさをお好みで表示できます。本スクリプトはWindows Scriptのヘルプファイルの場合のサンプルです。他のファイルに使うには書き換える必要があります。

あらかじめAutoItXというフリーソフトをインストールする必要があります。ダウンロード〜インストールの説明はこちら

HelpView.lzhをダウンロード、解凍し、必要に応じて書き換えて下さい。
// HelpView.js - ヘルプを開く際にフォントサイズとウィンドウを設定する
//
// Copyright(C) 2001,2003 A.Shimada

var HelpFile ="\"C:\\Program Files\\Microsoft Windows Script\\ScriptDocs\\Script56.CHM\"";
                                  //★ヘルプファイルの場所を指定する
var HelpTitle="Windows スクリプト テクノロジ";
                                  //★ウィンドウタイトルを指定する
var RegIEScr ="HKCU\\Software\\Microsoft\\Internet Explorer\\International\\Scripts\\";
var Wsh = WScript.CreateObject("WScript.Shell");
var AX  = WScript.CreateObject("AutoItX.Control");
var SIdx, FSize, ret;

//SIdx =Wsh.RegRead(RegIEScr+"Default_Script").toArray()[0];
                                  //Default Scriptのindexを求める
SIdx=24;
FSize=Wsh.RegRead(RegIEScr+SIdx+"\\IEFontSize").toArray()[0];
                                  //今のフォントサイズを退避する

Wsh.RegWrite(RegIEScr+SIdx+"\\IEFontSize",2,"REG_BINARY");
                                  //★好みのサイズ1=小,2=中,3=大を設定する
Wsh.Run (HelpFile);
ret=AX.WinWait(HelpTitle,"",5);
if (ret==0){
  AX.WinMove(HelpTitle,"",365,35,895,640);
}                                 //★好みのX,Y,Width,Heightを指定する

Wsh.RegWrite(RegIEScr+SIdx+"\\IEFontSize",FSize,"REG_BINARY");
                                  //フォントサイズを回復する

FolderOpen.js

エクスプローラでフォルダを開くときに、ウィンドウの位置と大きさを設定するWSH JScriptです。フリーソフトを使います。パラノイア向け?

FolderOpen.lzhをダウンロード、解凍して、任意のフォルダ名とタイトル等に書き換えて下さい。ダブルクリックして実行します。指定の位置と大きさでウィンドウが表示されます。ショートカットを作ってキー操作で実行したり、スタートメニューから実行したりするのも便利。なお、AutoItXというフリーソフトをインストールする必要があります。ダウンロード〜インストールの説明はこちら

既にHelpView.jsで使っている技ですが、ウィンドウがいつも指定どおり表示されるのは気持ちいいですよね!? そのはずですので切り出してみました。
// FolderOpen.js - Explorerフォルダウィンドウの大きさと位置を設定する
//
// 2004.2.27  作成
var Explorer = "%SystemRoot%\\explorer.exe";
var Wsh = WScript.CreateObject("WScript.Shell");
var AX  = WScript.CreateObject("AutoItX.Control");
var Folder = "\"C:\\Documents and Settings\""; // ★フォルダ名
var Title  = "Documents and Settings";         // ★ウィンドウタイトル(前方一致)
var ret;
Wsh.Run (Explorer+" "+Folder);
ret=AX.WinWait(Title,"",5);
if (ret==0){
  AX.WinMove(Title,"",70,200,640,480);         // ★ウィンドウのx,y,w,h
}

RunClipboard.hta

クリップボードの内容を実行するHTMLアプリケーションです。

起動するとクリップボード内のテキストを入力して実行します。例えば、テキストファイル内に記述されているURLを開く場合に、Ctrl+Cでコピーした後、本アプリケーションを起動します。

RunClipboard.lzhをダウンロード、解凍して下さい。

ダブルクリックして起動してもよいですが、ショートカットを作ってスタートメニューのどこかに置き、キーボードショートカットを割り当てておくと便利です。

<HTML>
<!-- クリップボードの内容を実行するHTMLアプリケーション
 Copyright(C) 2006 A.Shimada
 2006/10/6 更新
-->
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=x-sjis">
<HTA:APPLICATION ID="oHTA" APPLICATIONNAME="RunClipboard" SHOWINTASKBAR="no"
 SINGLEINSTANCE="yes" WINDOWSTATE="minimize" />
<SCRIPT>
Wsh = new ActiveXObject("WScript.Shell");
Arg = clipboardData.getData("text");
try{
  //何か処理が必要ならここに入れて下さい
  //Wsh.Popup("クリップボードの内容です。\r\r"+'"'+Arg+'"');
  Wsh.Run('"'+Arg+'"');
}
catch(e){
  Wsh.Popup('"'+Arg+'" は実行できませんでした。 '+e.message);
}
finally{
  window.close();
}
</SCRIPT></HEAD></HTML>

ZZdel.js

Windows Tempフォルダの中身を消すWSH JScriptです。

本スクリプトをそのまま実行すると環境変数tempが示すWindws Tempフォルダの内容を削除します。フォルダの中身を消す関数(DelTree)を定義して使っていますので、消すフォルダを容易に追加できます。

環境変数tempが定義されていないことはないと思いますが、フォルダ名を追加したときは慎重に確認しましょう。

ZZdel.lzhをダウンロード、解凍し、好みに書き換えて下さい。

// ZZdel.js - 指定フォルダの中身を消すスクリプト Version 2.1
//
//                          Copyright(C) 1999,2003 A.Shimada
//
var Wsh     = WScript.CreateObject("WScript.Shell");
var Fs      = WScript.CreateObject("Scripting.FileSystemObject");
var TempDir = Wsh.ExpandEnvironmentStrings("%temp%");

if(DelTree(TempDir+"\\")
// && DelTree("フォルダ名"+"\\")
// && DelTree("フォルダ名"+"\\")
   ){
  WScript.Echo("指定フォルダの中身を消しました。");
}
else{
  WScript.Echo("指定フォルダの中身は消せませんでした。");
}

// 指定フォルダ内のすべてのファイルとフォルダを消す関数
//
function DelTree(FolderName){
  // うまくいくことを確認したら下の1行をコメントにします
  if (Wsh.Popup(FolderName+"内を削除",0,"確認",33)!=1){return(false)};

  try {
    Fs.DeleteFile(FolderName+"*.*", true);
  }
  catch(e) {
    return (false);
  }
  try {
    Fs.DeleteFolder(FolderName+"*", true);
  }
  catch(e) {
    return (false);
  }
  return (true);
}

WordReplace.js

Microsoft Wordドキュメントの文字列を置換するWSH JScriptです。世界中にそのものズバリのサンプルがないようなのでアップしてみました。

WordReplace.lzhをダウンロード、解凍して下さい。ダブルクリックすると、まず、スクリプトと同じフォルダに置換元になるファイル WordReplaceSample.doc を自動的に作成します。その後のメッセージに対し続行すると文字列を置換し、ファイル YYYYMMDDHHMMSS.doc を保存します。

WindowsXP+OfficeXPの組み合わせで確認しています。たぶんWindows2000+Office2000でも動くでしょう。

このスクリプトの本質は最後の4行です。VBAヘルプを見て試行錯誤しました。

// Microsoft Word文字列の置換
var Wsh = WScript.CreateObject("WScript.Shell");
var Fs  = WScript.CreateObject("Scripting.FileSystemObject");
var FileName = "WordReplaceSample.doc";

Foldername = Fs.GetParentFolderName(WScript.ScriptFullName);

// 置換元になるWordファイルを作成する
oWord = WScript.CreateObject("Word.Application");
oDoc  = oWord.Documents.Add();
oDoc.Content.Font.Size = 12;
oDoc.Content.InsertAfter("#1#。ただいまの日時は#2#です。");
oDoc.SaveAs(Foldername+"\\"+FileName);
oDoc.Close();
oWord.Quit();

// Word文字列を置換する
oWord = WScript.CreateObject("Word.Application");
oWord.Visible = true;
oDoc  = oWord.Documents.Open(Foldername+"\\"+FileName);
Wsh.Popup("置換を始めます。");

dt = new Date();
HH = dt.getHours();
if (HH<6) {Msg="Zzz"}
else if (HH<10) {Msg="おはよう"}
else if (HH<18) {Msg="こんにちわ"}
else {Msg="こんばんわ"};

if (WordReplace("#1#", Msg) &&
    WordReplace("#2#", dt.toLocaleString()))
  Wsh.Popup("全ての置換に成功しました。");
else
  Wsh.Popup("置換エラーがあります。");

oWord.ActiveDocument.SaveAs(Foldername+"\\"+GetYMDstr(dt)+".doc");
//oDoc.Close();
//oWord.Quit();

// DateオブジェクトからYMDHMS文字列を求める関数
function GetYMDstr(d){
var month, day, hour, min, sec;
  month = (d.getMonth()+1).toString(10); if (month.length==1) month="0"+month;
  day   = d.getDate().toString(10);      if (day.length==1) day="0"+day;
  hour  = d.getHours().toString(10);     if (hour.length==1) hour="0"+hour;
  min   = d.getMinutes().toString(10);   if (min.length==1) min="0"+min;
  sec   = d.getSeconds().toString(10);   if (sec.length==1) sec="0"+sec;
  return(d.getFullYear().toString(10)+month+day+hour+min+sec);
}

// Word文字列を置換する関数
function WordReplace(FindStr,ReplaceStr){
  return(oDoc.Range(0,oDoc.Characters.Count).Find.Execute
           (FindStr,0,0,0,0,0,1,0,0,ReplaceStr));
}

ExcelReplace.js

Microsoft Excelドキュメントの文字列を置換するWSH JScriptです。世界中にありがちなものですけれども、私だったらこう作ります。

ExcelReplace.lzhをダウンロード、解凍して下さい。ダブルクリックすると、まず、スクリプトと同じフォルダに置換元になるファイル ExcelReplaceSample.xls を自動的に作成します。その後のメッセージに対し続行すると文字列を置換し、ファイルYYYYMMDDHHMMSS.xls を保存します。

WindowsXP+OfficeXPの組み合わせで確認しています。たぶんWindows2000+Office2000でも動くでしょう。

このスクリプトの本質は最後の数行です。置換に先立って文字列があることを確認しています。

// Microsoft Excel文字列の置換
var Wsh = WScript.CreateObject("WScript.Shell");
var Fs  = WScript.CreateObject("Scripting.FileSystemObject");
var FileName = "ExcelReplaceSample.xls";
var xlValues=-4163, xlPart=2;

Foldername = Fs.GetParentFolderName(WScript.ScriptFullName);

// 置換元になるExcelファイルを作成する
oExcel = WScript.CreateObject("Excel.Application");
oBook  = oExcel.WorkBooks.Add();
oExcel.Cells(2,3).Value = "#1#。ただいまの日時は#2#です。";
oExcel.Range("C2").Font.Size = 14;
oExcel.DisplayAlerts = false;
oBook.SaveAs(Foldername+"\\"+FileName);
oExcel.DisplayAlerts = true;
oExcel.Quit();

// Excel文字列を置換する
oExcel = WScript.CreateObject("Excel.Application");
oExcel.Visible = true;
oBooks = oExcel.WorkBooks.Open(Foldername+"\\"+FileName);
Wsh.Popup("置換を始めます。");

dt = new Date();
HH = dt.getHours();
if (HH<6) {Msg="Zzz"}
else if (HH<10) {Msg="おはよう"}
else if (HH<18) {Msg="こんにちわ"}
else {Msg="こんばんわ"};

if (ExcelReplace("#1#", Msg) &&
    ExcelReplace("#2#", dt.toLocaleString()))
  Wsh.Popup("全ての置換に成功しました。");
else
  Wsh.Popup("置換エラーがあります。");

oExcel.ActiveWorkbook.SaveAs(Foldername+"\\"+GetYMDstr(dt)+".xls");
//oExcel.Quit();

// DateオブジェクトからYMDHMS文字列を求める関数
function GetYMDstr(d){
var month, day, hour, min, sec;
  month = (d.getMonth()+1).toString(10); if (month.length==1) month="0"+month;
  day   = d.getDate().toString(10);      if (day.length==1) day="0"+day;
  hour  = d.getHours().toString(10);     if (hour.length==1) hour="0"+hour;
  min   = d.getMinutes().toString(10);   if (min.length==1) min="0"+min;
  sec   = d.getSeconds().toString(10);   if (sec.length==1) sec="0"+sec;
  return(d.getFullYear().toString(10)+month+day+hour+min+sec);
}

// Excel文字列を置換する関数
function ExcelReplace(FindStr,ReplaceStr){
  try{
    if (typeof(oExcel.Cells.Find
                 (FindStr,oExcel.Cells(1,1),xlValues,xlPart).Value)=="string")
      return(oExcel.Cells.Replace(FindStr,ReplaceStr,xlPart));
    else
      return(false);
  }
  catch(e){
    return(false);
  }
}

ExcelDateInput.js

Microsoft ExcelのInputBoxを使用して日付を入力要求/チェックするWSH JScriptです。何かの部品に使えるかもしれません。

ExcelDateInput.lzhをダウンロード、解凍し、ダブルクリックして実行します。何かに組み込んで使わないと意味はありませんが、さしあたり今日との差分日数を表示します。

WindowsXP+OfficeXPの組み合わせで確認しています。Windows2000+Office2000でも動きます。

// ExcelのInputBoxで日付を入力要求する。
// 1900/1/1〜2099/12/31の間の妥当な年月日であるかチェックする。
var Wsh = WScript.CreateObject("WScript.Shell");
var reDate = new RegExp("^(19|20)([0-9][0-9])\/([01]?[0-9])\/([0123]?[0-9])$");
var MB_TOPMOST=0x40000;

oExcel = WScript.CreateObject("Excel.Application");
try{
  dtInput = new Date();
  strErr  = "";
  strDefault = GetYMDstr(new Date());
  while (true){
    strInput = oExcel.InputBox(strErr+"日付を 1900-2099/mm/dd で指定して下さい。",
                               "日付の指定", strDefault);
    if (!strInput){
      oExcel.Quit();  // キャンセルされた
      WScript.Quit();
    }
    strDefault = strInput;
    if (strInput.match(reDate)==null){
      strErr = "形式が誤っています。\r\r";
      continue;
    }
    inty1 = parseInt(RegExp.$1,10)*100;
    inty2 = parseInt(RegExp.$2,10);
    intmm = parseInt(RegExp.$3,10);
    intdd = parseInt(RegExp.$4,10);
    dtInput.setFullYear(inty1+inty2, intmm-1, intdd);
    if ((1<=intmm)&&(intmm<=12)&&(1<=intdd)&&(intdd<=31)&&
        (dtInput.getDate()==intdd))
      break;
    strErr = "そのような年月日はありません。\r\r";
  }
}
catch(e){
  Wsh.Popup("Excelオープン中エラー。"+e.message,0,"エラー",MB_TOPMOST);
  oExcel.Quit();
  WScript.Quit();
}
finally{
  oExcel.Quit();
}

dtNow = new Date();       // さしあたり今日との差分日数を表示する
dtNow.setHours(0,0,0,0);
dtInput.setHours(0,0,0,0);
diffdays = (dtInput-dtNow)/(1000*60*60*24);
if (diffdays<0){
  strBA = "前"
  diffdays = -diffdays;
}
else
  strBA = "後"
Wsh.Popup(GetYMDstr(dtInput)+"は"+diffdays+"日"+strBA+"です。",0,"結果",MB_TOPMOST);

// DateオブジェクトからYMD文字列を求める関数
function GetYMDstr(d){
var month, day;
  month = (d.getMonth()+1).toString(10); if (month.length==1) month="0"+month;
  day   = d.getDate().toString(10);      if (day.length==1) day="0"+day;
  return(d.getFullYear().toString(10)+'/'+month+'/'+day);
}

emlReuse.js

emlファイルをドロップする、又は送ると、emlファイルの内容を再使用してOutlook Expressを編集の状態で開きます。ただし本文の大きさは1〜3KB位が限界です。

追加情報です。KB911567対策のアップデートが載りました。このスクリプトも意味がなくなりましたが、記念に残します。(2006/6/10)

 保存した .eml ファイルを Outlook Express の作成モードで開くことができない
 (成功したXUnsent.regファイルです。ダウンロードし、ダブルクリックして実行すると追加されます。)

アップデートを適用し、レジストリを操作するとX-Unsent: 1の指定が有効になりますので、作成中のemlファイルは編集の状態で開けます。また、送信済みのemlファイルを再使用するにはX-Unsent: 1を書き加えてやればよいです。Windows Scripting Host Laboratory(管理人むたぐちさん)の実用スクリプトダウンロードにある「emlファイルを再編集する」がそのものズバリです。(2006/6/24)

追加情報です。2006年12月のWindows Update KB923694に上のアップデートが取り込まれたようです。レジストリを操作すればX-Unsent: 1の指定が有効になります。(2006/12/17) 補足:取り込まれたことが表示されました。(2007/1/22付)

【説明】

これまで、デスクトップなどに保存した作成中のemlファイルをダブルクリックして編集していた方は多いようです。しかし2006年4月のWindows Update KB911567を適用すると編集状態にならなくなります。近々にも改善はされると思いますが、それまでのつなぎに、同等のことを実現するスクリプトを作ってみました。WindowsXP Pro SP2 + Outlook Express 6で確認しています。

・宛先、CC、BCC、件名、及びテキストの本文のみを再使用できます。HTML部分、及び添付ファイルは再使用できません。

・仕組み上、本文の大きいものは再使用できません。1KB位なら問題なさそうですが3KBでもできたものがあり、文字コードが関係していると思われます。

・本文を読んでいますので、今日の日付を埋め込むようなことが簡単にできます。これはいろいろ応用できそうです。一例として "{DATE}" を "YYYY/MM/DD" で置換える処理を入れてみました。

・v1.0で、emlファイル中の宛先、CC、BCCの表示名を再現するようにしましたが、この処理によって本文の大きさの制限がきびしくなってしまいました。制限にかかるようになった場合は更に縮めるか、v0.xをお使い下さい。

・emlファイル中に表示名がない場合は通常Outlook Expressの機能によってアドレス帳の表示名が現れます。

【インストールとアンインストール】

(1)ダウンロードしたファイルemlReusx.LZHを解凍して下さい。配布ファイルが展開されます。 emlReuse.jsをデスクトップに置くか、SendToフォルダに入れて「送る」ことができるようにするとよいでしょう。あるいは、emlReuse.jsは適当なフォルダに置き、ショートカットを作ってデスクトップやSendToフォルダに置いてもよいです。

(2)コード変換のため外部プログラムnkfwinが必要です。インターネットを「nkfwin」で検索、ダウンロード、解凍し、nkfwin.exeをシステムのsystem32フォルダにコピーして下さい。下記のページの中程にnkfwin.zipがあります。

VA007219 ソフトウェアの配布 dfd64 diskmap dkclear sdf (VA007219さん)
nkf.exe nkf32.dll Windows用 ネットワーク用漢字コード変換フィルタ シフトJIS,EUC-JP,ISO-2022-JP,UTF-8,UTF-16
nkfwin.zip version 2.0.5.1 2 download readme files nkfwin起動画面 nkfwin実行画面

nkfwin.zip version 2.0.5.1 2 downloadをクリックしてダウンロード、解凍します。そして2051\win\フォルダのnkfwin.exeをC:\Windows\system32フォルダにコピーして下さい。

アンインストールは、emlReuse.js、そのショートカット、及びnkfwin.exeを削除して下さい。レジストリは変更していません。

【使い方】

(0)再使用したいemlファイルを作成します。Outlook Expressでメールを選択して適当なフォルダにドラッグ&ドロップします。あるいは、Outlook Expressで作成中のメールをメニュー[ファイル]-[名前を付けて保存]で保存します。

  なお、emlファイルのヘッダに X-Unsent: 1 を書き加える必要はありません。なにしろ見てませんから。(^^;;;

(1)emlファイルをemlReuse.jsのアイコンにドロップするか、右クリック「送る」でemlReuse.jsに送ります。すると編集状態でOutlook Expressが開きます。本文のサイズが大きい場合はエラーメッセージが出ますので、なんとか縮めるようにして下さい。

使用にあたってのヒントがありますので、ぜひREADME.TXTをご覧下さい。スクリプトの仕組みも書いてあります。

【改訂歴】

2006/4/28 v1.02 表示名中の"()\を再現するようにした。他。
2006/4/22 v1.0 宛先、CC、BCCの表示名を再現するようにした。他。
2006/4/28 v0.82 宛先、CC、BCCの抽出処理を変更した。

v1.02をダウンロードする(LHA書庫ファイルemlReus8.lzh:5,657バイト)

v0.82をダウンロードする(LHA書庫ファイルemlReus7.lzh:5,306バイト)



emlTime.js

Windows Vistaで、保存したemlファイルの更新日時が変わってしまう現象があります。このスクリプトはemlファイルのタイムスタンプを、ヘッダのRecieved又はDateフィールドの日時に合わせるものです。

フリーソフトのFTIMEを使用しますのでダウンロードして準備しておきます。
FTIME Win32ファイル・タイムスタンプ変更ユーティリティ (H.Yasumuroさん)

emlTime1.zipをダウンロード、展開し、emlTime.jsあるいはそのショートカットをデスクトップなどに置きます。

emlファイル又はフォルダをドラッグ&ドロップ(複数可)すると、ヘッダのRecieved又はDateフィールドの日時を読んでタイムスタンプを合わせます。処理途中に確認メッセージと、最後に終了メッセージが出ます。わずらわしいときはコメントにして下さい。

なお、起動時に「このファイルを開きますか? 不明な発行元…」というメッセージが出たときは、emlTime.jsを右クリックしてプロパティ画面を出し、「ブロックの解除」ボタンを押して下さい。

Windows Vista Ultimate SP1, XP Pro SP2で確認しています。

たぶん、もう少しインタフェースとコードを見直しますが、とりあえず動くものができたということで公開します。(2008/4/25)
フォルダをドロップできるようにしました。また、メッセージを見直しました。など(2008/4/26)
// emlファイルのタイムスタンプをReceived又はDateに合わせる
//
// Copyright(C) 2002,2008 A.Shimada
// 2008/4/26 更新

var Wsh = WScript.CreateObject("WScript.Shell");
var Fs  = WScript.CreateObject("Scripting.FileSystemObject");
var Arg = WScript.Arguments;
var ForReading=1, ForWriting=2, ForAppending=8;
var WS_NoShow=0, WS_NORMAL=1, WS_MinNoActChg=7;
var reReceived=/^Received:[^;]+;[^0-9]+([0-3]?[0-9]) (...) ((?:19|20)[0-9][0-9]) ((?:[0-1][0-9]|2[0-3]):[0-5][0-9]):[0-5][0-9]/i;
var reDate=/^Date:[^0-9]+([0-3]?[0-9]) (...) ((?:19|20)[0-9][0-9]) ((?:[0-1][0-9]|2[0-3]):[0-5][0-9]):[0-5][0-9]/i;
var MONTH = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep",
                      "Oct","Nov","Dec");
var nFile,nFolder,ix,msg;

if (Arg.length==0) {
  WScript.Echo("emlファイル又はフォルダをドロップして下さい。");
  WScript.Quit();
}
nFile   = 0;
nFolder = 0;
for (ix=0 ; ix<Arg.length ; ix++){
  if (Fs.FileExists(Arg(ix))){
    processFile(Arg(ix));
  }
  else if (Fs.FolderExists(Arg(ix))){
    processFolder(Arg(ix));
  }
}
msg = "終了しました。 emlファイル数:"+nFile;
if (nFolder!=0)
  msg += "、フォルダ数:"+nFolder;
WScript.Echo(msg);

// ファイルの処理
function processFile(fName){
var ext;
  ext = Fs.GetExtensionName(fName);
  if (ext.toLowerCase()!="eml")
    return(10);
  nFile++;
  if ((nFile % 50)==0)  //★ 50件毎にメッセージを表示する
    WScript.Echo("emlファイルを処理中です。 ("+nFile+"件目)");
  return(emlTime2HeaderTime(fName));
}
// フォルダの処理
function processFolder(foName){
var fo, fic, foc;
  WScript.Echo("フォルダを処理中です。\n\n\""+foName+"\"");
  nFolder++;
  fo  = Fs.GetFolder(foName);
  fic = new Enumerator(fo.files);
  for (; !fic.atEnd(); fic.moveNext()) // ファイルについて
    processFile(fic.item());
  foc = new Enumerator(fo.SubFolders);
  for (; !foc.atEnd(); foc.moveNext()) // 下位フォルダについて
    processFolder(foc.item());
}
// emlファイルのタイムスタンプをヘッダの時刻に合わせる関数
function emlTime2HeaderTime(fName){
var Ta,rfound,dfound,ctr,L1,L2,command,year,month,m,day,time;
  Ta = Fs.OpenTextFile(fName, ForReading);
  if (Ta.AtEndOfStream){
    WScript.Echo("ファイルは空です。\n\n\""+fName+"\"");
    return(10);
  }
  rfound = false;
  dfound = false;
  L1 = Ta.ReadLine();
  ctr = 1;
  while(!Ta.AtEndOfStream && ctr<1000){   // ヘッダは1000行もない
    while(!Ta.AtEndOfStream && ctr<1000){
      L2 = Ta.ReadLine();
      ctr++;
      if ((L2!="") && (L2.substr(0,1)<=" ")){
        L1 += L2.replace(/^\s*/g, "");
      }
      else
        break;
    }
    if (L1.match(reReceived)!=null){    // Receivedが見つかったら
      rfound = true;                    // ループを抜ける
      break;
    }else if (L1.match(reDate)!=null){  // Dateが見つかったら
      dfound = true;                    // 記憶しておく
      dLine = L1;
    }
    if (L2=="")
      break;
    L1 = L2;
  }
  Ta.Close();
  if ((!rfound) && (!dfound)){
    WScript.Echo("ReceivedもDateも見つかりません。\n\n\""+fName+"\"");
    return(20);
  }
  if (!rfound)            // Receivedは見つからなかったがDateがあった
    dLine.match(reDate);  // Dateでmatchのやり直し
  day   = RegExp.$1;
  month = RegExp.$2;
  year  = RegExp.$3;
  time  = RegExp.$4;
  for (m=1 ; m<=12 ; m++)
    if (month==MONTH[m-1])
      break;
  if (m==13){
    WScript.Echo("ヘッダの月名を認識できません。\n\n\""+fName+"\"\n\""+L1+"\"");
    return(21);
  }
  command = "cmd /c ftime -d "+
            year+"\/"+m+"\/"+day+" -t "+time+" -- \""+fName+"\">nul";
  //WScript.Echo("コマンド実行 "+command);  //★ わずらわしいときはコメントに
  Wsh.Run (command, WS_NoShow, true);
  return(0);
}


emlMove.js

【説明】

WindowsメールやOutlook Expressのメールを選択してエクスプローラの適当なフォルダにドラッグ&ドロップするとemlファイルを作成できます。しかし、この方法はドラッグ&ドロップを複数回行った場合に件名(ファイル名)が重複するとエラーになってしまいます。本スクリプトはその問題を解決するため、ファイル名が重複しないように自動的に番号(1),(2),(3)…を付加して移動します。

【使い方】

emlMove.zipをダウンロード、展開します。スクリプト内の移動先フォルダを適切に変更し、デスクトップなどに置いておきます。

空の作業用のフォルダにWindowsメールやOutlook Expressからドラッグ&ドロップしてemlファイルを作成します。そのemlファイルを本スクリプトのアイコンにドラッグ&ドロップします。なお、1回にドラッグ&ドロップできるファイル数は20個位です。「引数一覧が長すぎます」というエラーになった場合は複数回に分けて下さい。

また起動時に「このファイルを開きますか? 不明な発行元…」というメッセージが出たときは、emlMove.jsを右クリックしてプロパティ画面を出し、「ブロックの解除」ボタンを押して下さい。

Windows Vista Ultimate SP1, XP Pro SP3で確認しています。

【更なるヒント】
  1. Windows Vistaでは作業用のフォルダにemlファイルを作成した後、本スクリプトを使わないで保存用のフォルダに移動してもよいです。重複エラーになっても「移動するが両方のファイルを保持する」指定で自動的に順序番号を付けられます。

  2. Outlook Expressで多数のemlファイルを取り出す場合は、別掲のOEviewなどのツールを使うとよいです。重複時に順序番号を付けて保存用のフォルダに取り出しできます。

  3. 移動先フォルダが複数ある場合は、スクリプトをコピーし、移動先フォルダを書き換えてアイコンを並べておくとよいでしょう。また、移動先フォルダが多数の場合は、コピーしたスクリプトをSendToフォルダに置き、emlファイルを右クリックしてそれぞれに「送る」のもよいでしょう。

  4. ドロップ先や送り先はスクリプト本体でなく、ショートカットでもよいです。

  5. 誤って同じメールをコピーしてしまった場合は別掲のemlCheckを使うと重複したメールを簡単にチェック、削除できます。

// emlMove.js - emlファイルをファイル名が重複しないように移動する
//
// Copyright(C) 2008 A.Shimada
// 2008/11/24 作成

var DestDir = "C:\\test"; // ★移動先フォルダ
Wsh = WScript.CreateObject("WScript.Shell");
Fs  = WScript.CreateObject("Scripting.FileSystemObject");
Param = WScript.Arguments;
if ((Param.length==0)||(!Fs.FileExists(Param(0)))||
    (Fs.GetExtensionName(Param(0)).toLowerCase()!="eml")){
  WScript.Echo("emlファイルを1個以上20個位までドロップして下さい。");
  WScript.Quit();
}
if (!Fs.FolderExists(DestDir)){
  WScript.Echo("移動先フォルダ \""+DestDir+"\" がありません。作成して下さい。");
  WScript.Quit();
}
if ((Fs.FileExists(Param(0)))&&
    (Fs.GetParentFolderName(Param(0)).toLowerCase()==
     Fs.GetAbsolutePathName(DestDir).toLowerCase())){
  WScript.Echo("移動元と移動先フォルダ \""+DestDir+"\" が同じです。終了します。");
  WScript.Quit();
}
for (i=0; i<Param.length; i++){
  MoveEML(Param(i));
}

// emlファイルを移動する
function MoveEML(eml){
  var FileBase, FileExt, FileName, Modify;
  if (Fs.FileExists(eml)){
    FileBase = Fs.GetBaseName(eml);
    FileExt  = Fs.GetExtensionName(eml);
    if (FileExt.toLowerCase()=="eml"){
      FileName = FileBase+"."+FileExt;
      Modify = 0;
      while(Fs.FileExists(Fs.BuildPath(DestDir,FileName))){
        Modify++; // ファイル名が重複したら(1),(2),(3)…を付ける
        FileName = FileBase+"("+Modify+")."+FileExt;
      }
      Fs.MoveFile(eml,Fs.BuildPath(DestDir,FileName));
    }
  }
}

OEDownCount.js

Microsoft Outlook Express 6のニュース読み取りの、1度に取得するヘッダー数の最大は1000に制限されています。この数を増やすWSH JScriptです。新しいニュースグループを読むときに便利かもしれません。

OEDownCount.lzhをダウンロード、解凍し、ダブルクリックして実行します。Outlook Express 6の[ツール]-[オプション]メニューの読み取りタブの1度に取得するヘッダー数が書き換わります。なお、'1000'というマジックナンバーはプログラムでチェックしているようで、1000を超えた数のままOKボタンを押すとエラーになります。その際は1000以下に減らして保存し、もう一度このスクリプトを実行しましょう。

WindowsXP+Outlook Express 6の組み合わせで確認しています。

要はレジストリ書き換え技ですが、目的のキーに到達するために謎のキーを一つ読んでいます。なお、複数ユーザでのテストはしていません。

// Microsoft Outlook Express Newsの1回のダウンロード数を増やす
//
// Copyright(C) 2004 A.Shimada
// 2004/2/17 作成

var Wsh=WScript.CreateObject("WScript.Shell");
var RegPre  ="HKCU\\Identities\\";
var RegIdent="Default User ID";
var RegPost ="Software\\Microsoft\\Outlook Express\\5.0\\News\\Download at a time";
var MB_YESNO=4, MB_ICONQUESTION=32, IDYES=6, IDNO=7;
var retId, retNo;
var DownNo = 5000;  //★1回のダウンロード数

try{
  retId=Wsh.RegRead(RegPre+RegIdent);
  retNo=Wsh.RegRead(RegPre+retId+"\\"+RegPost);
}
catch(e){
  Wsh.Popup("レジストリの読み取りに失敗しました。");
  WScript.Quit();
}

if(Wsh.PopUp("現在のダウンロード数は "+retNo+" です。"+DownNo+" に設定しますか?",
             0, "OutlookExpressの設定", MB_YESNO+MB_ICONQUESTION)==IDYES){
  Wsh.RegWrite(RegPre+retId+"\\"+RegPost, DownNo, "REG_DWORD");
}

OEPollMail.vbs

Microsoft Outlook Express 6の新着メッセージチェックの時間を制限するWSH VBScriptです。実際はOutlook Expressのメニュー [ツール]-[オプション]-[全般タブ]から設定するのがよいと思いますが、技術的な興味から作ってみました。

OEPollMail.zipをダウンロード、解凍し、ダブルクリックして実行します。スクリプト内の最短時間より短い時間が指定されている場合は最短時間に置き換えます。Outlook Expressを起動すると値が反映されます。リモートコンピュータの場合に意味が出てくるのですが、あまり使い勝手を考えていないのはご容赦。複数ユーザにも対応しています。

WindowsXP+Outlook Express 6+WMIの組み合わせで確認しています。WMIのパラメタに戻り値が返るためJScriptで書けなかったのが残念です。

' Microsoft Outlook Express 新着メッセージチェックの時間を制限する
'
' Copyright(C) 2006 A.Shimada
' 2006/6/4 作成

const MIN_POLL_MINUTES  = 10  '★ 最短時間(分)。これより短い場合は置き換えます。
const HKEY_CURRENT_USER = &H80000001
const POLL_VALUE_NAME   = "Poll For Mail"
dim   arrKeyNames, arrValueNames, arrValueTypes

Comp = "."  '★ コンピュータ名 "."(ピリオド)はローカルコンピュータを表します。
Uid  = ""   '★ ユーザID   ローカルコンピュータには不要。
Pwd  = ""   '★ パスワード ローカルコンピュータには不要。入力は工夫して下さい。

if Comp="." then
  MsgComp = ""
else
  MsgComp = "コンピュータ """ & Comp & """, "
end if

set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
oLocator.Security_.ImpersonationLevel = 3 ' impersonate default for NT
on error resume next
set oService = oLocator.ConnectServer(Comp, "root\default", Uid, Pwd)
if Err.Number<>0 then
  WScript.Echo("コンピュータ """ & Comp & """に接続できませんでした。" &  _
               Err.Description & " Err.Number=0X" & Hex(Err.Number))
  WScript.Quit
end if
on error goto 0
set oReg = oService.Get("StdRegProv")

oReg.EnumKey HKEY_CURRENT_USER, "Identities", arrKeyNames
for ixKey=0 to UBound(arrKeyNames)
  oReg.GetStringValue HKEY_CURRENT_USER, "Identities\" & arrKeyNames(ixKey), _
                      "Username", OEUserName
  MsgPrefix = MsgComp + "ユーザー""" & OEUserName & """の"
  strKeyPath = "Identities\" & arrKeyNames(ixKey) & _
               "\Software\Microsoft\Outlook Express\5.0\Mail"
  oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValueNames, arrValueTypes
  PollValueTYpe = 0
  for ixVal=0 to UBound(arrValueNames)
    if arrValueNames(ixVal) = POLL_VALUE_NAME then
      PollValueTYpe=arrValueTypes(ixVal)
      exit for
    end if
  next
  if PollValueTYpe=4 then    ' 4 = REG_DWORD
    oReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, POLL_VALUE_NAME, dwValue
    if (dwValue=-1) or (dwValue=&Hffffffff) then
      WScript.Echo MsgPrefix & "時間の設定はありませんでした。"
    else
      if dwValue<(MIN_POLL_MINUTES*60*1000) then
        oReg.SetDWORDValue HKEY_CURRENT_USER, strKeyPath, POLL_VALUE_NAME, _
                           MIN_POLL_MINUTES*60*1000
        WScript.Echo MsgPrefix & "時間の設定を" & dwValue/(60*1000) & "分から" & _
                     MIN_POLL_MINUTES & "分にしました。"
      else
        WScript.Echo MsgPrefix & "時間の指定は" & dwValue/(60*1000) & "分でした。"
      end if
    end if
  else
    WScript.Echo MsgPrefix & "時間の値はありませんでした。"
  end if
next

WLPrint.vbs, WMPrint.vbs, OEPrint.vbs

Windows Liveメール、Vista Windowsメール、又は Outlook Express 6のメール本文を一括して印刷するWSH VBScriptです。エコに逆行しているような気もしますけれども需要があるようです。

以下はOutlook Express 6についての説明ですが、Windows Liveメール、Vista Windowsメールも同じです。スクリプト内のフォルダ名だけが変わります。

WLPrint.zipWMPrint.zip、又はOEPrint.zipをダウンロード、解凍して下さい。起動時に「このファイルを開きますか? 不明な発行元…」というメッセージが出たときは、スクリプトを右クリックしてプロパティ画面を出し、「ブロックの解除」ボタンを押して下さい。

【準備】
OE(Outlook Express)の印刷するフォルダ名を指定しておきます。「受信トレイ」から変更する場合は書き換えて下さい。

【使い方】
(1)OEを起動し、受信トレイの一覧画面を表示します。
(2)スクリプトをダブルクリックして実行します。
(3)印刷するメールの件数の入力要求に対し、件数を入力します。
(4)実行確認のメッセージが出ますので、印刷する先頭のメールを選択し、OKボタンを押します。一覧順にメールが開かれて印刷されます。
(5)全ての印刷が終わると終了メッセージが出ます。

【注意事項】
(1)現れる画面を想定してキー操作を行っているため、印刷中はパソコンに触れないで下さい。
(2)印刷のオプションは指定できませんので印刷前に確認して下さい。
(3)プリンタのモニタ画面などが出るとキー操作が乱れるため、抑止して下さい。私の環境ではキヤノンのステータスモニタが現れたので抑止しました。その他、裏で動くプログラムは停止しておくのが好ましいです。

以下の組み合わせで確認しています。
Vista + Windows Liveメール2009。 Vista + Windowsメール。 WindowsXP + Outlook Express 6。

' Microsoft Outlook Express メール本文を一括印刷する
'
' 印刷するフォルダの一覧を開いて本スクリプトを実行して下さい。
'
' Copyright(C) 2007 A.Shimada
' 2007/7/1 作成

set WshShell = WScript.CreateObject("WScript.Shell")
const WinTitle = "受信トレイ - Outlook Express"  '★フォルダ名を指定する
const IDOK=1, MB_OKCANCEL=1, MB_TOPMOST=&H40000
dim ix, Lim

Lim = InputBox("印刷するメールの件数を指定して下さい。", "件数の入力", 10)
if Lim="" then
  WScript.Quit()
end if

if not WshShell.AppActivate(WinTitle) then
  WScript.Echo (WinTitle+" を開いてから実行して下さい。")
  WScript.Quit()
end if

if WshShell.Popup(Lim&" 通のメールを印刷します。"&vbLf&vbLf& _
                  "印刷する先頭のメールを選択して下さい。"&vbLf& _
                  "実行しますか?" ,0,"確認", _
                  MB_OKCANCEL+MB_TOPMOST)<>IDOK then
  WScript.Quit()
end if

WshShell.AppActivate(WinTitle)
WScript.Sleep 1000
WshShell.SendKeys "%"  ' 選択されたメールを開く
WshShell.SendKeys "F"
WshShell.SendKeys "O"
WScript.Sleep 1000

for ix=1 to Lim
  WshShell.SendKeys "%"  ' 印刷ダイアログを開く
  WshShell.SendKeys "F"
  WshShell.SendKeys "P"
  WScript.Sleep 1000
  WshShell.SendKeys "{ENTER}"
  WScript.Sleep 3000      '★印刷サイズが大きい場合はもっと長く?
  WshShell.SendKeys "^>"  ' 次のメールを開く
  WScript.Sleep 1000
next

WshShell.SendKeys "{ESCAPE}"  ' メールを閉じる
WshShell.Popup "印刷が終わりました。",0,"終了",MB_TOPMOST

OECompact0.js

Microsoft Outlook Express がWindowsXP SP2で100回ごとにフォルダの最適化を行うようになりました。このカウンタを0にして勝手に最適化させないようにするWSH JScriptです。

OECompact0.lzhをダウンロード、解凍して下さい。ショートカットをスタートアップに登録しておけばシステムの起動時にカウンタが0になります。Outlook Expressを100回起動/終了しなければ勝手に最適化されることはありません。なお、最適化は頻度はともかく必須の操作です。時間があるときにメニュー[ファイル]-[フォルダ]から実行しましょう。また、最適化の前にOECompactDlg.jsDBXSizeCheck.jsの情報を読むことを強くお薦めします。

スクリプト中のコメント記号をはずせば対話的な実行になります。

WindowsXP SP2+Outlook Express 6の組み合わせで確認しています。

要はレジストリ書き換え技ですが、目的のキーに到達するために謎のキーを一つ読んでいます。なお、複数ユーザでのテストはしていません。

// Microsoft Outlook ExpressのCompact Check Countを0にする
//
// Copyright(C) 2004 A.Shimada
// 2004/9/26 作成

var Wsh=WScript.CreateObject("WScript.Shell");
var RegPre  ="HKCU\\Identities\\";
var RegIdent="Default User ID";
var RegCount="Software\\Microsoft\\Outlook Express\\5.0\\Compact Check Count";
var MB_YESNO=4, MB_ICONQUESTION=32, IDYES=6;
var retId, retNo;

try{
  retId=Wsh.RegRead(RegPre+RegIdent);
  retNo=Wsh.RegRead(RegPre+retId+"\\"+RegCount);
}
catch(e){
//  Wsh.Popup("レジストリ Compact Check Count はありません。");
  WScript.Quit();
}
//if(Wsh.PopUp("Compact Check Countは "+retNo+" です。"+" 0 に設定しますか?",
//             0, "OutlookExpressの設定", MB_YESNO+MB_ICONQUESTION)==IDYES)
  Wsh.RegWrite(RegPre+retId+"\\"+RegCount, 0, "REG_DWORD");

OECompactDlg.js

Microsoft Outlook Express がWindowsXP SP2で100回ごとにフォルダの最適化を行うようになりました。初回は下のような問い合わせメッセージが出ますが、「今後、このメッセージを表示しない」をチェックすると、100回ごとにいきなり最適化が行われるようになります。びっくりしないように、このメッセージを再表示するようレジストリを書き換えるWSH JScriptです。

追加情報です。最適化に関連するアップデートが出ました。 適用すると最適化の際に自動的にバックアップが取られ、100回ごとのメッセージも新しくなります。もう、このスクリプトは不要です。(2006/6/9)

追加情報です。「100回」を数えるカウンタは、メニュー[ツール]-[オプション]-[メンテナンスタブ]-[整理するボタン]からローカルファイル(ニュースフォルダ)の最適化を行うと、メールフォルダは最適化されずにリセットされてしまいます。この場合、メールフォルダの最適化はユーザが意識して行わなければなりません。(2006/6/24)

追加情報です。2006年12月のWindows Update KB923694に上のアップデートが取り込まれたようです。あちこちの掲示板に、最適化するとごみ箱にbakファイルができるという書き込みがあります。(2006/12/17) 補足:取り込まれたことが表示されました。(2007/1/22付)


OECompactDlg.lzhをダウンロード、解凍し、ダブルクリックして実行します。

WindowsXP SP2+Outlook Express 6の組み合わせで確認しています。

要はレジストリ書き換え技ですが、目的のキーに到達するために謎のキーを一つ読んでいます。なお、複数ユーザでのテストはしていません。
// Microsoft Outlook Express最適化問い合わせの再表示
//
// Copyright(C) 2006 A.Shimada
// 2005/2/6 作成

var Wsh=WScript.CreateObject("WScript.Shell");
var RegPre  ="HKCU\\Identities\\";
var RegIdent="Default User ID";
var RegNoAsk="Software\\Microsoft\\Outlook Express\\5.0\\Dont Show Dialogs\\Compact Do not Ask Again";
var MB_YESNO=4, MB_ICONQUESTION=32, IDYES=6;
var retId, retNo;

try{
  retId=Wsh.RegRead(RegPre+RegIdent);
  retNo=Wsh.RegRead(RegPre+retId+"\\"+RegNoAsk);
}
catch(e){
  Wsh.Popup("レジストリ Compact Do not Ask Again はありません。");
  WScript.Quit();
}
if(Wsh.PopUp("Compact Do not Ask Againは "+retNo+" です。"+" 0 に設定しますか?",
             0, "OutlookExpressの設定", MB_YESNO+MB_ICONQUESTION)==IDYES)
  Wsh.RegWrite(RegPre+retId+"\\"+RegNoAsk, 0, "REG_DWORD");


●アップデートについては下記をご覧下さい。(2006/6/9)

  Outlook Express 6 Service Pack 1 を起動すると、すべての電子メール アイテムは、見付からないことがあります。

機械翻訳でかなり日本語が不自由なページですが、WindowsXP SP2 + Outlook Express6に、このページに書いてあるアップデートを適用すると、最適化の際にごみ箱に「フォルダ名.bak」の名前で自動的にバックアップが取られるようになります。100回ごとに出てくるメッセージも下のように変わり、いきなり最適化されることはなくなりました。




DBXSizeCheck.js

Microsoft Outlook Expressのメッセージを記録しているDBXファイルのサイズをチェックするWSH JScriptです。

DBXファイルはOutlook Expressのフォルダごとに作られ、仕様上のサイズの上限は2GBです。このサイズに達すると書き込みはもちろんのこと最適化すらできません。受信トレイ・送信済みアイテム・削除済みアイテムを整理・最適化していないと、いつの日か、メールが受信できない、送信済みアイテムに入らない、削除できない、ことになります。それどころか、あちこちの掲示板を見ると、2GBに達していなくても(数100MBでも?)大きくなり過ぎてから最適化するとメールが消えるなどの悲劇が起きるようです。そこで、DBXファイルのサイズをチェックして、指定サイズをオーバしていたら警告を出すスクリプトを作ってみました。

DBXSizeCheck.lzhをダウンロード、解凍して下さい。ショートカットをスタートアップに登録しておけば、システムの起動時、自動的にDBXファイルサイズのチェックを行い、指定サイズを超えているDBXファイルが見つかった場合下のような警告メッセージを表示します。チェックの上限はエディタで書き換えできます。下の例は上限を50MBにし、51MBのMachineフォルダが見つかった場合です。



スタートアップには登録せず、時々手動で実行するという場合は、スクリプト中のコメント記号を消せば対話的な実行になります。実行開始の確認メッセージと、全て上限以下でも結果メッセージが出るようになります。

【使用上のヒント】
  1. チェックの上限はいくつにしたらよいでしょうか? 私は100MBを目安にしており、大きくても200MBくらいが安全なのではないかと思います。小さすぎますかね?

  2. 上限を超えていたらどうすればよいでしょうか? かなりオーバしているのでしたら、いきなり最適化すると危険なことがあるようです。安全のために何はさておきバックアップを取ります。そして、複数のフォルダを新たに作成し、内容や時系列でメールを分類して移動します。すなわちフォルダを分割するわけです。少々のオーバでしたら不要なメールを削除した後、最適化してもよいでしょう。

    DBXファイルのサイズが極端に大きいと、最適化が「Outlook Express またはほかのアプリケーションがこのフォルダを使用しています。」というエラーで中断してしまうことがあります。私の環境では1GB弱の大きさでもこのエラーになりました。こうなった場合は残したいメールを別のフォルダにコピーし、Outlook Expressを終了してDBXファイルを削除するしかありません。なお、DBXファイルを削除しても、Outlook Expressで対応するフォルダにアクセスすれば空のファイルが再作成されます。

  3. メール数が少ない、あるいはメールがないのにDBXファイルサイズが異常に大きい? (添付ファイルが大きいということもあるかもしれませんが…)メールを削除しても、その場所は無効になるだけでDBXファイルは小さくなりません。無効な場所を詰めるためには最適化が必要です。

  4. DBXファイルを小さく保つには? メッセージルールを使用するなどして受信トレイにはメールを残さないようにします。また、定期的に全てのメールフォルダを整理し、最適化します。特に送信済みアイテム・削除済みアイテムには知らず知らずのうちにメールがたまっていくので注意が必要です。削除/移動してメールが見えなくなっていても最適化しないとDBXファイルは大きいままです。

  5. DBXファイルのフォルダサイズの制限はあるのでしょうか? 制限はないと思いますが、「すべてのフォルダの最適化」や検索の時間、フルバックアップの扱いやすさなどを考えて程々にした方がよいでしょう。

  6. 添付ファイルだけを削除できます。 添付ファイルが不要なら、かなりの削減効果が見込めると思います。一例として、下記の方法を試した上で本文が読めることを確認したら、元の添付ファイル付きメールを削除します。なお、削除しただけではDBXファイルは小さくならないことをお忘れなく。

    方法1は、まず、Outlook Expressのメールをエクスプローラの適当なフォルダにドラッグ&ドロップして添付ファイル付きのemlファイルを作成します。次に、emlCheck.exeを使って添付ファイルを削除します。最後に、emlファイルをOutlook Expressのフォルダにドラッグ&ドロップします。

    方法2は、まず、OEview.exeを使ってメールの本文のみをemlファイルとして取り出します。次に、emlファイルをOutlook Expressのフォルダにドラッグ&ドロップします。

    私自身は方法1で、ある期間のメールをガバっと選択し、ドラッグ&ドロップしてemlファイルを作ったらいきなり元のメールは削除してしまう、という無謀なことを行っています。元のフォルダに戻す場合はこれが簡単です。

  7. もう少し細かくDBXファイルのチェックができます。 OEview.exeにはDBXファイルのヘルスチェック機能があり、ファイルサイズ、メッセージ数、削除ブロック数をリストし、上限をオーバした項目にマークを付けて表示できます。削除ブロック数はメールを削除した無効な場所の大きさを示し、最適化が必要かどうかの目安になります

  8. 本スクリプトの警告メッセージをコピーできます。 大した事ではありませんが、一般にWindowsのメッセージの表示テキストはCtrl+Cキーでクリップボードにコピーし、エディタなどに貼り付けできます。警告メッセージを消してから、ゆっくり作業できます。

本スクリプトはWindows98/2000/XP SP2 + Outlook Express 6の組み合わせで確認しています。なお、上限をオーバしたファイルがたくさんある場合のテストは不完全です(警告メッセージが画面からはみ出てしまうことは確認しましたが表示の上限が不明)。また、複数ユーザでのテストはしていません。

DBXファイルのフォルダ名を求めるためにExpandEnvironmentStringsで環境変数を展開しています。

// Microsoft Outlook ExpressのDBXファイルサイズチェック
//
// Copyright(C) 2006 A.Shimada
// 2006/2/28 作成

var Wsh=WScript.CreateObject("WScript.Shell");
var Fs =WScript.CreateObject("Scripting.FileSystemObject");
var RegPre  ="HKCU\\Identities\\";
var RegIdent="Default User ID";
var RegStore="Software\\Microsoft\\Outlook Express\\5.0\\Store Root";
var MB_YESNO=4, IDYES=6;
var MB_STOP=16, MB_QUESTION=32, MB_EXCLAMATION=48, MB_INFORMATION=64;
var Limit=100; //★チェック上限(MB)。大きくても200MBくらいが良いのでは。

//if (Wsh.PopUp("Outlook ExpressのDBXファイルサイズが"+Limit+
//              "MBを超えていないかチェックします。\n\n"+
//              "実行しますか?",0,"実行の確認",
//              MB_YESNO+MB_QUESTION)!=IDYES){
//  WScript.Quit();
//}
retId=Wsh.RegRead(RegPre+RegIdent);
retSt=Wsh.ExpandEnvironmentStrings(Wsh.RegRead(RegPre+retId+"\\"+RegStore));
if (!Fs.FolderExists(retSt)){
  Wsh.Popup(retSt+"フォルダがありません。",0,"中止",MB_STOP);
  WScript.Quit();
}
fo=Fs.GetFolder(retSt);
fc=new Enumerator(fo.files);
ctr=0;
s="";
LimitB=Limit*1024*1024;
for (; !fc.atEnd(); fc.moveNext()){
  fn=fc.item();
  if (Fs.GetExtensionName(fn).toUpperCase()=='DBX'){
    f=Fs.GetFile(fn);
    if (f.Size>LimitB){
      ctr++;
      s += Fs.GetFileName(fn)+"\t"+Math.ceil(f.Size/(1024*1024))+"M\n";
    }
  }
}
if (ctr==0){
//  Wsh.Popup("Outlook ExpressのDBXファイルサイズチェック結果\n\n"+
//            "全てのDBXファイルサイズは"+Limit+"MB以下でした。",0,
//            "正常",MB_INFORMATION);
}
else{
  Wsh.Popup("Outlook ExpressのDBXファイルサイズチェック結果\n\n"+
            ctr+"個のDBXファイルのサイズが"+Limit+"MBをオーバしています。\n"+
            "フォルダを分割する、最適化するなどの対策が必要です。\n\n"+s,0,
            "警告",MB_EXCLAMATION);
}

EventCheck.js

Windowsのイベントログをフィルタして参照するWSH JScriptです。Windows2000,XPのAdministrator権限で実行します。Windows NTでも前提を満たせば動きます。

【説明】

Windowsイベントログをフィルタしてcsvファイルに出力したり、IE画面(Internet Explorer画面)に色付け表示したりできます。Administratorのパスワードを知っていれば、パラメータ指定でリモートコンピュータのログも参照できます。

フィルタにより日時で絞込み、ログ、種類、ソース、分類、イベント、ユーザー、コンピュータの各項目のパターンで、監視対象外と監視対象(監視必須)を振り分けできます。監視対象の指定は監視対象外の指定より優先します。例えば情報ログを監視対象外にするがインストーラの情報だけは監視対象にする、というような振り分けができます。振り分けた結果で別のcsvファイルに出力したり、IE画面に色付け表示したりできます。

出力項目は、ログ、種類、日時、ソース、分類、イベント、ユーザー、コンピュータです。なお、監視対象ログにはイベントメッセージを追加します。

本スクリプトはAdministrator権限のあるユーザで実行する必要があります。userアカウントではsecurityログを参照できません。

【インストールとアンインストール】

ダウンロードしたファイルEVCheckx.LZHをフォルダ付きで解凍して下さい。EventCheckフォルダ内に配布ファイルが展開されます。なお、ファイル名は8.3形式を超えていますのでLHAでは正しく解凍できません。また、必ずしも専用フォルダでなくてもかまいませんが、デフォルトでは実行したフォルダ内にログファイルを出力しますので専用のフォルダとしておくのがよいです。アンインストールはEventCheckフォルダを丸ごと削除して下さい。レジストリは変更していません。

【使い方】

(1)同梱のSamplexxExec.jsを参考に、エディタでEventCheck.jsを起動するスクリプトを作成します。IE画面表示の有無、フィルタファイル名、csvファイル名などを指定します。
(2)同梱のSamplexxFilter.txtを参考に、エディタでフィルタファイルを作成します。ログの日時、監視対象外と監視対象の振り分けを指定します。
(3)(1)で作成したスクリプトをダブルクリックする等で実行します。
(4)実行すると、ログの日時を確認するダイアログが出力されますので確認してOKボタンを押します。

パラメータ、フィルタファイルの形式は、README.TXTをご覧下さい。注意事項、スクリプトの仕組みも書いてあります。

【改訂歴】

2004/7/3 ログの絞込み種類で、監査成功、監査失敗を指定できるようにした。
2004/6/19 README.TXTを作成した。
2004/6/6 ログの絞込み、出力にユーザーを追加した。その他いろいろ。

ダウンロードする(LHA書庫ファイルEVCheck2.lzh:12,381バイト)


Pflog2csv.js

Windows XP SP2のFirewallログを参照するWSH JScriptです。

Pflog2csv.lzhをダウンロード、解凍して下さい。ダブルクリックして実行します。Personal FirewallログをCSVファイルに変換し、CSVファイルと関連付けられたExcelなどのプログラムで開きます。
rundll32を使って関連付けで開くことができる。衆知のようですがこれには「感動した!」。
// Windows XP SP2 Firewallログを参照する
//
// Copyright(C) 2004 A.Shimada
// 2004/10/22 作成

var InFile    = "C:\\windows\\pfirewall.log";  //★入力ログ
var OutFile   = "C:\\windows\\pfirewall.csv";  //★出力CSV
var hVersion  = "#Version: 1.5";
var hSoftware = "#Software: Microsoft Windows Firewall";
var hTimeForm = "#Time Format: Local";
var hFields   = "#Fields: date time action protocol src-ip dst-ip src-port dst-port size tcpflags tcpsyn tcpack tcpwin icmptype icmpcode info path";

var Wsh = WScript.CreateObject("WScript.Shell");
var Fs  = WScript.CreateObject("Scripting.FileSystemObject");
var ForReading=1, ForWriting=2;
var Ta, Tb, L, L1, L2, L3, L4, L5;
var reFields   = /\s+/g;
var reDateTime = /^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d.+/;

if (!Fs.FileExists(InFile)){
  WScript.Echo(InFile+"がありません。");
  WScript.Quit();
}
Ta = Fs.OpenTextFile(InFile, ForReading);
L1 = Ta.ReadLine();
L2 = Ta.ReadLine();
L3 = Ta.ReadLine();
L4 = Ta.ReadLine();
if ((L1!=hVersion) || (L2!=hSoftware) || (L3!=hTimeForm) || (L4!=hFields)){
  WScript.Echo(InFile + "の先頭行が不正です。\r\r"+
               L1 + "\r" + L2 + "\r" + L3 + "\r" + L4);
  WScript.Quit();
}
Tb = Fs.OpenTextFile(OutFile, ForWriting, true);
L  = "date time," + hFields.substr(19).replace(reFields, ",");
Tb.WriteLine(L);
while(!Ta.AtEndOfStream){
  L5 = Ta.ReadLine();
  if(L5.match(reDateTime)!=null){
    L = L5.substr(0,19) + ","+ L5.substr(20).replace(reFields, ",");
    Tb.WriteLine(L);
  }
}
Ta.Close();
Tb.Close();
Wsh.Run("rundll32 url,FileProtocolHandler " + OutFile); //関連付けで開く


ShortcutKey.js

Windowsのプログラムやフォルダのショートカットに設定したショートカットキーの一覧をExcelに表示するWSH JScriptです。

ここで言うショートカットキーとはキーボードショートカット、あるいはホットキーなどと呼ばれているもので、スタートメニュー内やデスクトップ上にあるショートカットに割り当てたキーのことです。割り当てておけばメニューをたどったりアイコンをクリックしたりする代わりに、Altキー、Ctrlキー、Shiftキー+任意のキーの組み合わせでプログラムを起動したりフォルダを開いたりできます。割り当てる方法は下記をどうぞ。

マイクロソフト サポート技術情報 - 310417 Windows XP でプログラムにキーボード ショートカットを割り当てる方法

【ショートカットキー設定のヒント】

キーを割り当てるショートカットはスタートメニュー下の一つのフォルダに集め、ショートカットの名前には割り当てた任意のキーを付けておくとよいです。

(例) M OutlookExpress、W Word、X Excel、7 Delphi2007フォルダ、シフト+V ボリューム

こうしておけばキーを忘れてもメニューをたどって簡単に確認できます。このスクリプトはいりません。(笑)

【このスクリプトについて】

ShortcutKey.zipをダウンロードし、右クリックで展開して下さい。ダブルクリックして実行すると、Excelを開いてユーザプロファイル下のlnkファイルでキーが割り当てられているショートカットを一覧にします。All Users下も調べたい場合はコメントを外して下さい。

起動時に「このファイルを開きますか? 不明な発行元…」というメッセージが出たときは、ShortcutKey.jsを右クリックしてプロパティ画面を出し、「ブロックの解除」ボタンを押して下さい。

なお、英数字、ファンクションキー以外のキー、例えば \ ^ は表示されません。これは仕様とします(笑、さりげなく)。

Windows Vista + Excel2007、及び XP + Excel2002 で確認しています。Windows2000 + Excel2000でも動くと思います。
// ShortcutKey.js - ショートカットキーの一覧をExcelに表示する
//
// Copyright(C) 2002,2008 A.Shimada
// 2008.9.6 更新
var MB_INFORMATION=64, MB_TOPMOST=0x40000;
var Wsh = WScript.CreateObject("WScript.Shell");
var Fs  = WScript.CreateObject("Scripting.FileSystemObject");
var XL  = WScript.CreateObject("Excel.Application");
XL.Visible = true;
XL.WorkBooks.Add;
XL.Columns(1).ColumnWidth = 40;
XL.Columns(2).ColumnWidth = 40;
XL.Columns(3).ColumnWidth = 20;
XL.Cells(1, 1).Value = "ショートカット";
XL.Cells(1, 2).Value = "リンク先";
XL.Cells(1, 3).Value = "ショートカットキー";
XLix = 1;
FCount = 0;
Env = Wsh.Environment("Process");
//ListHotKey(Env("ALLUSERSPROFILE")); //★AiiUsersも調べる
ListHotKey(Env("USERPROFILE"));
XL.Cells(XLix+1, 1).Value = "";
if (XLix==1)
  Msg = "ショートカットキーは見つかりませんでした。";
else
  Msg = (XLix-1) + "個のショートカットキーが見つかりました。";
Wsh.PopUp(Msg,0,"結果",MB_INFORMATION+MB_TOPMOST);

function ListHotKey(Dir){
  var fo, foc, fic, fin, Sc;
  fo  = Fs.GetFolder(Dir);
  foc = new Enumerator(fo.SubFolders);
  for (; !foc.atEnd(); foc.moveNext())
    ListHotKey(foc.item());
  fic = new Enumerator(fo.files);
  for (; !fic.atEnd(); fic.moveNext()){
    fin = fic.item();
    FCount++;
    if ((FCount % 100)==0)
      XL.Cells(XLix+1, 1).Value = FCount+"個のファイルを調べました。";
    if (Fs.GetExtensionName(fin).toUpperCase()=="LNK"){
      Sc = Wsh.CreateShortcut(fin);
      if (Sc.Hotkey!=""){
        XLix++;
        XL.Cells(XLix, 1).Value = fin;
        XL.Cells(XLix, 2).Value = Sc.TargetPath;
        XL.Cells(XLix, 3).Value = Sc.Hotkey;
      }
    }
  }
}

実験WMI

ワークグループ内のWindows XP Pro SP2同士で、WMIのリモート操作を行う(別のコンピュータに接続する)実験です。Windows XP Homeでは試していません。

Win2000とNT 4.0では成功したのにXP同士では一発ではできませんでした。「ドメインでないワークグループだからできないのか?  そもそもXP同士ではできないのか?」 疑問はつのるばかりでしたが、SP2ではセキュリティが強化され、もっと事態は複雑になってしまいました。

結論はAdmin権限のある同じアカウント(同じパスワードを設定)を使ってできました。確認するポイントは下記です。
  1. まず、ワークグループの場合は、接続先に、ネットワークアクセスでローカルユーザとしてログインするように設定します。具体的には下記のどれかの方法によります。なお、下記は全てWindows XP Proでの方法で、Windows XP Homeではできないようです。

    ・エクスプローラのメニュー[ツール]-[フォルダオプション]の表示タブで「簡易ファイルの共有を使用する(推奨)」のチェックを外します。

    ・ローカルセキュリティポリシーのローカルポリシー、セキュリティオプションの「ネットワークアクセス:ローカルアカウントの共有とセキュリティモデル」で「クラシック - ローカルユーザがローカルユーザとして認証する」を選択します。

    ・次のMicrosoftの参考文献を読んで、ForceGuestを0にします。

      ワークグループにインストールされているWin XP Proでセキュリティを設定する方法

  2. WMIに取り組む前に、ネットワーク接続を確認するのがよいでしょう。コンピュータの管理のメニュー[操作]-[別のコンピュータへ接続]で、目的のコンピュータに接続してみます。うまくいけばWMIに接続できなくてもイベントログは参照できるはずです。

  3. 次に、Microsoftの参考文献をじっくり読んで基礎知識を得ます。

      Windows XP SP2のWMIに関する問題のトラブルシューティング方法

    ただし、これだけ読むとドメインに参加していないとできないのじゃないかと疑問になります。実際はワークグループのコンピュータ同士でも可能です。

  4. 接続先のWindowsファイアウォールのリモート管理の例外を許可します。gpedit.mscを起動し、ワークグループの場合は標準プロファイルに設定します。許可するアドレスはlocalsubnetがよいでしょう。ドメインの場合はドメインプロファイルへ。

  5. もし、接続先にWindowsファイアウォール以外のアクセスを制限するプログラム、例えば他社のファイアウォールやVPNソフトがインストールされていたら停止します。私の環境ではVPNソフトが古かったのが問題だったようで、最新版に更新することでリモート操作に成功しました。

  6. 接続先のDCOMのリモート許可を与えます。DCOMCNFGを起動し、administratorsへリモートのアクセス許可、起動とアクティブ化のアクセス許可を全てチェックします。セキュリティ上は問題かも。
成功するまでにいろいろなエラーを得ました。(苦笑)

エラー 原因と対策
イベントビューア
「コンピュータ "xxx" に接続できません。エラー
アクセスが拒否されました。」
接続先のForceGuestが1です。0にして下さい。
WBEMTEST等
「0x80070005 アクセスが拒否されました。」
システムイベントログ
「ソース:DCOM イベント:10009 構成されているどのプロトコルを使っても、DCOM がコンピュータ xxx と 通信できませんでした。」
接続先のファイアウォール又はDCOMの設定に問題があります。見直して下さい。
WBEMTEST等
「0x800706ba RPCサーバを利用できません。」 

エラーにはまってSP2のDCOMについて調べ始めると、RestrictRemoteClientsとか、EnableAuthEpResolutionの設定が気になると思いますがデフォルトでよいです。

また、WMIコントロールのプロパティのセキュリティタブの設定も気になるところですが、Admin権限のあるアカウントであれば、アカウントが登録されていなくてもよいし、リモートの有効化がチェックされていなくてもよいです。


実験WshRemote

ワークグループ内のWindows XP Pro SP2同士で、WSHのリモート操作を行う(別のコンピュータにスクリプトを送って実行する)実験です。Windows XP Homeでは試していません。

WSH5.6のヘルプを見て設定しようとしましたがPoledit.exeやらwindowsscript.admファイルやらがわかりません。WWWを探したところ、お気に入りの@ITでわかりやすそうなページを見つけました。下記を見て接続先にRemoteレジストリを設定し、wscript -regserverコマンドを入れます。

  WshControllerオブジェクトの詳細

準備はできたぜと、WSH5.6のヘルプのサンプルを実行しましたが、動きません。WMIの接続はできているのにな〜?

いろいろ試したところ下記を確認してできました。よく見ると、WMIの逆接続がある場合に必要な設定です。
  1. 接続先はもちろん、接続元にも実験WMIと同じ設定を行います。

  2. 接続先のファイアウォールのアプリケーションにWScript.exeを登録します。

  3. 接続元のDCOMアクセス許可、制限の編集のANONYMOUS LOGINにリモートアクセス許可を与えます。

  4. 接続元のファイアウォールにアプリケーションを登録します。実行するとファイアウォールがブロックするので、それに応答することで登録できます。具体的にはスクリプトを起動したWScript.exe又はCScript.exeを解除することになります。なお、ブロックのメッセージに応答して登録した場合、スコープが「任意のコンピュータ(インターネット上のコンピュータを含む)」になっていますので「ユーザのネットワーク(サブネット)のみ」等に変更した方がよいでしょう。

失敗したときのエラーは下記です。

WSHのエラー 原因と対策
エラー:リモート サーバ マシンが存在しないか、利用できません。
コード:800A01CE
接続先のファイアウォール又はDCOMの設定に問題があります。
システムイベントログにもDCOM 10009が記録されています。
実験WMIと同じポイントを見直して下さい。
接続先のファイアウォールにWScript.exeが登録されていません。
C:\Windows\System32\WScript.exeを登録して下さい。
接続元のファイアウォールにWScript.exe又はCScript.exeが登録されていません。
ブロックのメッセージが出ているはずですので、解除して下さい。
エラー:書き込みできません。
コード:800A0046
接続元のANONYMOUS LOGINにリモートアクセス許可が与えられていません。
与えて下さい。

あと、MicrosoftダウンロードセンターからWSH 5.6.0.8825をダウンロードして入れ替えたところ、スクリプトのリモート実行は行われるものの、終了時に800A01CEエラーが出るようになってしまいました。モジュール入れ替えはWindows Update(2005/10/23現在、WSH 5.6.8820)に任せた方がよさそうです。WSH 5.6.0.8825でも問題ないPCもありますが、これはずいぶん前に手動で入れ替えて、その後Windows Updateを行っているものです。


実験BinaryFile

Outlook ExpressのDBXファイル内のメール数の表示、要はバイナリファイルを読み込んで表示するスクリプトをVBScriptとPowerShellで書いてみました。

なお、WSH JScriptにも挑戦したのですがバイナリの処理ができないので断念しました。WWWを検索すると"iso-8859-1"テキストで読み込む方法が見つかりますが、0X80あたりの値の取得には特別な処理が必要になります。

DBXMsgCount.zipをダウンロード、解凍して下さい。DBXMsgCount.vbsとDBXMsgCount.ps1が現れます。なお、実行前に右クリックしてプロパティ画面を出し「ブロックの解除」ボタンを押して下さい。

WindowsXP, WindowsVista, Windows7で動作を確認しています。もちろんWindowsVista, Windows7にOutlook ExpressはないのでWindowsXPからコピーしたDBXファイルで試しています。

VBScriptとPowerShellの比較は下の表のような感じです。
項目 VBScript PowerShell
動作環境 Windows98以降標準。ただし、今回ADODBを使うのでWindowsXP以降と思われる。 .NET Framework2.0。WindowsXP, VistaではPowerShellのインストールが必要。Windows7では標準。
利用オブジェクト ADODB.Stream BinaryReader
一部の入力 できない。大きなファイル処理には時間がかかる。 できる。
ファイル共用 できない。Outlook Expressと排他。 できる。Outlook Expressの排他を無視できる。
Int32の処理 できない。バイトから組み立てる必要がある。 できる。

---------- DBXMsgCount.vbs ----------
' DBXファイル内のメッセージ数を表示するWSH(VBS)
Const POS = 196 'DBXファイル内のメッセージ数の位置
FileName = WScript.Arguments(0) 'ドロップしたDBXファイルを処理
Set Stm = CreateObject("ADODB.Stream")
Stm.Type = 1
Stm.Open
Stm.LoadFromFile FileName
Stm.Position = POS
Buffer = Stm.Read(4)
Stm.Close
Set Stm = Nothing

C1 = AscB(MidB(Buffer,4,1))
C2 = AscB(MidB(Buffer,3,1))
C3 = AscB(MidB(Buffer,2,1))
C4 = AscB(MidB(Buffer,1,1))

WScript.Echo Hex(C1) & " " & Hex(C2) & " " & Hex(C3) & " " & Hex(C4)

Count = C1*2^24 + C2*2^16 + C3*2^8 + C4

WScript.Echo Count

---------- DBXMsgCount.ps1 ----------
# DBXファイル内のメッセージ数を表示するPowerShellスクリプト
Param([string] $FileName) # パラメータで指定したDBXファイルを処理
$POS = 196 # DBXファイル内のメッセージ数の位置
$r = new-object System.IO.BinaryReader([System.IO.File]::Open(
    $FileName,
    [System.IO.FileMode]::Open,
    [System.IO.FileAccess]::Read,
    [System.IO.FileShare]::ReadWrite))
$s = $r.BaseStream.Seek($POS, [System.IO.SeekOrigin]::Begin)  
$Count = $r.ReadInt32()
$r.Close()
$Count.ToString("X8")
$Count


touchNow.js

複数のフォルダやファイルをドラッグ&ドロップしたりSendToで送ったりすれば、現在の時刻で更新日時を統一できます。ただし「コマンドライン文字列の制限」で一度に処理できる個数には上限があります。

なお、名前にUnicodeの濁点又は半濁点を含むと処理できないことがあります。その点を改善したtouchNow.batの説明をご覧下さい。 (2017/3/26)

ファイル日時を変更するためのソフトは多数ありますが、単機能を、手軽にスクリプトで実現することを目指しました。

しかし、WSHだと日時の書き換えはできません。一方、PowerShellなら書き換えできますがドラッグ&ドロップで渡せません。そこで両者のいいとこ取りをして、WSHでドラッグ&ドロップを受け付け、PowerShellに引き渡して書き換えるようにしました。

touchNow.jsをダウンロードし、展開して下さい。実行前に右クリックしてプロパティ画面を出し「ブロックの解除」ボタンを押して下さい。

Windows7, 8, 10で動作を確認しています。JScript Version 5.8、PSversionはそれぞれ 2.0、3.0、5.1でした。

// touchNow.js - フォルダ/ファイルの更新日時を現在の時刻にする
//
// 2016/10/10 1バイト単一引用符があれば2個続ける
// 2016/11/15 2バイト単一引用符があれば2個続ける
//            2バイトバッククォートがあれば2個続ける

var Wsh = WScript.CreateObject("WScript.Shell");
var Arg = WScript.Arguments;

if (Arg.length==0) {
  WScript.Echo("フォルダかファイルを一つ以上ドロップして下さい。");
  WScript.Quit();
}

var target = "";
var d  = new Date();
var dt = d.getFullYear() + "/" + (d.getMonth()+1) + "/" + d.getDate() + " " +
         d.getHours()    + ":" + d.getMinutes()   + ":" + d.getSeconds();

for (i = 0; i < Arg.length; i++) {
  target = Arg(i).replace(/'/g, "''");    // 1バイト単一引用符を2個続ける
  target = target.replace(/’/g, "’’"); // 2バイト単一引用符を2個続ける
  target = target.replace(/‘/g, "‘‘"); // 2バイトバッククォートを2個続ける
  
  Wsh.Run("PowerShell Set-ItemProperty -LiteralPath \"'" + target +
          "'\" -name LastWriteTime -value '" + dt + "'", 7, true);
}

【不思議な現象】

PowerShellオプションの-Pathでなく-LiteralPathを使ってワイルドカードが適用されないように、また単一引用符で囲んでエスケープ文字が適用されないようにしています。

しかしサラっと作ったところ不思議な現象が発生しました。PowerShellにファイル名が渡ったときに連続した複数の空白が一つにまとめられてしまいます?! その現象に対しては、上のスクリプトのように更に二重引用符で囲んで、"'ファイル名'" としたら回避できました。引用符の順番を逆にして '"ファイル名"' としてもよさげです。

空白がまとめられてしまう現象や、それに対して2種類の引用符で囲むのが正しい書き方なのか、検索してみましたがわかりませんでした。

【ファイル名中の引用符などの扱い】 (2016/11/15)

ファイル名中に単一引用符がある場合、2個続けることで1文字を表現します。これは想定内だったのですが、1バイト単一引用符だけでなく2バイト単一引用符も2個続けることが必要でした。どうやらPowerShellでは1バイト単一引用符と2バイト単一引用符とを区別しないようです。ISEで試したところ、文字列を1バイト単一引用符で囲んでも2バイト単一引用符で囲んでもOKです。1バイトと2バイトの組み合わせすら可能です。これは二重引用符も同様でした。

それでは2バイト二重引用符も2個続けなければならないかというと、それは不必要でした。おそらく単一引用符で囲んでいるためと納得。

また、いろいろ試したところ、2バイトバッククォートも2個続けることが必要でした。1バイトバッククォートでは不必要(単一引用符で囲んでいるため)なのに、なんだかな〜という感じです。

まとめると次のようになります。

 1バイト単一引用符  … あれば2個続ける
 2バイト単一引用符  … あれば2個続ける
 1バイト二重引用符  … ファイル名には使えないので考慮しなくてよい
 2バイト二重引用符  … 何もしなくてよい
 1バイトバッククォート … 何もしなくてよい
 2バイトバッククォート … あれば2個続ける


touchNow.bat

上のtouchNow.jsを使っていて、日時を変更できないフォルダがあるのに気づきました。調べてみたところ、Unicodeの名前に落とし穴がありました。

Unicodeの濁点又は半濁点付きの文字は、1文字に見えていても、基の文字(基底文字)+濁点又は半濁点(結合文字)の2文字で表されている場合があります。 この結合文字がWSHのドラッグ&ドロップでは正しく受け取れません。Windows7, 8では濁点が「"?" (0x3F)」に変換されてしまいます。 Windows10では少し進化したものの「結合文字の濁点(0x3099)」が「単独の濁点(0x309B)」に変換されてしまい、 結局フォルダやファイルが見つからないということになってしまいます。

そこでWSHをあきらめて昔ながらのバッチファイルで試したところドラッグ&ドロップで結合文字も受け取れました。

直接バッチファイルにドラッグ&ドロップするとコマンドプロンプト画面が出て煩わしいですから、ショートカットを作り、プロパティの [実行時の大きさ] を [最小化] して使うとよいでしょう。

Windows7, 8, 10で動作を確認しています。

rem touchNow.bat - フォルダ/ファイルの更新日時を現在の時刻にする
rem 2017/4/11 2バイト空白問題の対策

set allArgs=%*
set allArgs=%allArgs: =$dbSpace$%
call :proc %%allArgs%%
goto end

:proc
set dt=%date% %time%
:loop
if "%~1"=="" goto endloop
set target=%~1
set target=%target:$dbSpace$= %
set target=%target:'=''%
set target=%target:’=’’%
set target=%target:‘=‘‘%
PowerShell Set-ItemProperty -LiteralPath "'%target%'" -name LastWriteTime -value '%dt%'
shift
goto loop

:endloop
exit /b

:end
rem pause

【更新日時の表示が変わらない問題】

エクスプローラの詳細表示から複数の対象をドロップすると次々に更新日時が変わっていくのが見えますが、たまに表示が変わらないものがあります?! エクスプローラを再読み込みすると更新日時は変更されているので表示の問題です。 その現象は名前によるようで、どのようなものかというと、結合文字を含む名前と含まない名前とが同一の場合。例えば「"ほげ" (0x307B+0x3051+0x3099)」と「"ほげ" (0x307B+0x3052)」があった場合、後者の表示が変わらないことがあります。どちらも見た目は「"ほげ"」で区別がつきません。そんなまぎらわしい名前を付ける人はいないでしょうが、テストのために作っていました。

ちなみに、上のコードには入れませんでしたが、PowerShellのコマンドにStart-Sleepを付け加えて1秒ほど止めてやると、この現象は起きないようです。推測すると、エクスプローラの表示が追い付かず、しかも忘れてしまうということなのでしょう。

【2バイト空白問題と対策】(2017/4/11)

名前に2バイト空白があって1バイト空白がない場合、二重引用符で囲まれずにバッチファイルに渡ってきますが、なんと2バイト空白が引数の区切りと解釈され、名前が分割されてしまいます?! 検索したところ、バッチファイルへのドラッグ&ドロップの問題としてよく知られており、2バイト空白の他にもコンマやセミコロンなどが問題になるそうです。せっかくバッチファイルに書き直したのに(泣)。一つの対策は「二重引用符で囲まれるように、フルパスのどこかに1バイト空白を入れる」というものなのですが、名前を変更せずにバッチファイルで対策する方法も見つかったので組み込んでみました。

すなわち (1) %* で全ての引数を受け取り、2バイト空白を仮の文字列(上のコードでは $dbSpace$)に置き換える。 (2) 置き換えた引数でメインの処理を呼び出す。 (3) メインの処理では %~1 で一つの引数=名前を受け取った後、仮の文字列を2バイト空白に戻す。という方法です。上のコードには入れませんでしたが、必要ならコンマなども同様にします。

元々の処理を含め、置換処理ばかりのコードになってしまいました。

【でも結局は】

私が気に入っているソフトに結合文字を含むファイル名が扱えないものがあり、結局はUnicodeの正規化に挑戦しなければなりません(苦笑)。検索したところPowerShellで実現した方がいらっしゃいますね。


SKReminder.js

退社時間の登録を忘れないようにするためのWSH JScriptと、その設定方法です。WinXP、Win2000用。

要はログオフスクリプトを設定しておいてメッセージを出す、というお手軽な方法ですけれども、実用になるのでは。ログオンにも使えるようにしているため行数がありますが、ログオフの目的には後半のWScript.Echoの2行だけでもOK。

SKReminder.lzhをダウンロード、解凍して下さい。ここからが少し面倒なのですが、

(1)[スタートメニュー]-[ファイル名を指定して実行]などからグループポリシーエディタgpedit.mscを起動する。
(2)[ユーザの構成]-[Windowsの設定]-[スクリプト(ログオン/ログオフ)]を開く。
(3)[ログオフ]をダブルクリックして、ログオフスクリプトにSKReminder.jsを追加する。
(4)ログオンスクリプトにも設定する場合はパラメータにlogonを指定する。

詳しくはMicrosoftの ユーザーログオフスクリプトを割り当てる などをご覧下さい。

これで理由書を書かなくてすみますよ。(笑)

(ログオフを検知し、忘れていた場合でも再度ログオンせずに登録できるようにするプログラムSKReminder.exeも公開中。Windows98でも動きます。 )
// SKReminder.js - Windows ログオン/ログオフ スクリプトサンプル
//
// Copyright(C) 2004 A.Shimada
//
// 2004/4/10  作成

var Arg = WScript.Arguments;

if ((Arg.length!=0)&&(Arg(0).toLowerCase()=="logon")){
  WScript.Echo("出社時間を登録しましょう。");
}
else{
  WScript.Echo("退社時間を登録しましたか?\r\r"+
               "忘れている場合は再度ログオンして登録して下さいな。");
}

 
ご感想などは下のメールアドレスへどうぞ。

akio_dot_shimada@nifty.ne.jp(spam対策) 島田明雄