あいつにキー入力を送りたい

自動でキーボード入力をしたいという時に便利なのがSendInputというAPIです(詳細はこちら)。これを使えば好きな入力を最前面のウィンドウに対して送信出来ますが、やはりソース書いてコンパイルして...となるとメンドクサくて気軽に使うことは出来ません。
そんな私の気持ちを察してくれたのか、wshではShellのsendkeyというメソッドを使う事で同じことが実現出来るようです。ためしに一つスクリプトを作成してみました。

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "notepad.exe"
WScript.Sleep 1000
objShell.SendKeys "I"
WScript.Sleep 1000
objShell.SendKeys " "
objShell.SendKeys "h"
WScript.Sleep 100
objShell.SendKeys "a"
WScript.Sleep 100
objShell.SendKeys "v"
WScript.Sleep 100
objShell.SendKeys "e"
WScript.Sleep 1000
objShell.SendKeys " "
objShell.SendKeys "n"
WScript.Sleep 100
objShell.SendKeys "o"
WScript.Sleep 1000
objShell.SendKeys " "
objShell.SendKeys "m"
WScript.Sleep 100
objShell.SendKeys "o"
WScript.Sleep 100
objShell.SendKeys "n"
WScript.Sleep 100
objShell.SendKeys "e"
WScript.Sleep 100
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 10
objShell.SendKeys "e"
WScript.Sleep 1000
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "{BACKSPACE}"
WScript.Sleep 100
objShell.SendKeys "y"
WScript.Sleep 1000

WScript.Echo "終わり(閉じてね)"

ネットワーク切断を検知するスクリプト

ケーブルの断線や直接繋がっているスイッチのダウンなどを検知することが出来るスクリプトです。切断を検知出来たからといってそれを直す事が出来るわけではありませんのであしからず。

////////////////////////////////////////////////////////////////////////////////////////////
// ネットワーク切断チェックツール
//
// 作成日:2007.09.11
//
// [参考URL]
//  http://blog.livedoor.jp/takaaki_bb/archives/50500014.html
//  時間取得のロジックはこちらから拝借しました
//
//   http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/mar05/hey0321.mspx
//   大元のロジックはここから拝借しました
////////////////////////////////////////////////////////////////////////////////////////////

var strLatestEvent , strFilePath;

var FileObj       = WScript.CreateObject("Scripting.FileSystemObject");
var WshShell      = WScript.CreateObject("WScript.Shell");
var strComputer   = ".";
var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\" +
                              strComputer + "\\root\\wmi");

// ファイルの保存先(%TEMP%)
strFilePath = WshShell.ExpandEnvironmentStrings("%TEMP%") + "\\";
// strFilePath = "C:\\";

var colMonitoredEvents = objWMIService.ExecNotificationQuery("Select * from MSNdis_StatusMediaDisconnect");
var LogFile ;

// 
WriteLogInfo("★ネットワーク切断確認ツール\r\n\r\n[起動時間] " + getStrNowDateTime() + "\r\n\r\n");

while ( true )
{
	strLatestEvent = colMonitoredEvents.NextEvent();
	WriteLogInfo(getStrNowDateTime() + "\t" + "Network is Disconnected.");
}


/****************************************************************
 * ログをファイルに書き込み
 ****************************************************************/
function WriteLogInfo( sData )
{
	WScript.Echo(strFilePath + "\\disconnect.log");
	LogFile = FileObj.OpenTextFile(strFilePath + "disconnect.log", 8, true);
	LogFile.WriteLine(sData);
	LogFile.Close();

	return 0;
}

/****************************************************************
 * Dateオブジェクトを "yyyy/mm/dd hh:mi:ss" で表現する
 ****************************************************************/
function getStrNowDateTime() {
    var dt = new Date();
    return (
	dt.getYear() + "/" + format2d(dt.getMonth() + 1) + "/" + format2d(dt.getDate()) + " " +
	format2d(dt.getHours()) + ":" + format2d(dt.getMinutes()) + ":" + format2d(dt.getSeconds())
    );
}

/********************************************
 * 1桁の数字の頭に 0 をつける
 ********************************************/
function format2d(strInt) {
    if (strInt < 10) {
        return ("0" + strInt);
    } else {
        return strInt;
    }
}

プロセスを停止するスクリプト(WMI)

プロセスを停止させるスクリプトを作ってみました。

//*****************************************//
// プロセス停止用スクリプト(WMI使用)       //
//                                         //
// ・引数                                 //
//  ProcessName - 削除したいプロセス名   //
//   (複数ある場合はスペースで区切る)     //
//                                         //
// [usage]                                //
//  WScript.exe ps.js CMD.EXE DELPHI.EXE //
//*****************************************//

// Shellオブジェクト //
var WshShell      = WScript.CreateObject("WScript.Shell")  ;

// 対象コンピュータ名(今は自分自身) //
var strComputer   = ".";

// WMIサービスオブジェクト
var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\" +
                              strComputer + "\\root\\cimv2");
var pr , i ;

// 引数チェック //
if ( WScript.Arguments.Length == 0 )
{
	WScript.Echo(
		"引数が足りません \n" +
		" ・引数\n" +
		"  ProcessName - 削除したいプロセス名を指定してください\n"     +
		"  (複数ある場合はスペースで区切って複数指定してください)\n\n" +
		" [usage]\n" +
		"  WScript.exe ps.js CMD.EXE DELPHI.EXE"
	);
	WScript.Quit(-1);
}

try
{
	for ( i = 0 ; i <= WScript.Arguments.Length - 1 ; i++ )
	{
		while ( true )
		{
			pr = new Enumerator(
				objWMIService.ExecQuery(
				"SELECT * FROM Win32_Process Where Name = '" + WScript.Arguments(i) + "'"
				)
			     );
			if ( pr.atEnd() == false )
			{
				for ( ; !pr.atEnd() ; pr.moveNext() )
				{
					pr.item().Terminate();
				}
				continue;
			}
			else
			{
				break;
			}
		}
	}
}
catch ( e )
{
	WshShell.LogEvent(1 , "処理失敗:\n[原因]\n" + e.Description );
}

unix系だとpsとgrepawkとkill使えば出来そうなんですが、Windowsだと気軽に出来るのがなかったので作ってみました。WMIって便利。