WSH プログラミングの基本的なお話

  既定のスクリプトホスト



Cscript.exe も、Wscript.exe も引数に、既定のスクリプトホストを変更するオプションを持っています。

//H:CScript 既定のスクリプト ホストを CScript.exe に変更する
//H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)

これらが実行された時に何が変わるかというと、レジストリの中の WSH に関係づけられた拡張子の
Shell\Open\Command と
Shell\Open2\Command が入れ替わります。

例えば、HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command の内容を
表示するスクリプトは以下のようになります

  
Set WshShell = WScript.CreateObject("WScript.Shell")

strPath = "HKLM\SOFTWARE\Classes\VBSFile\Shell\Open\Command\"
strValue = WshShell.RegRead( strPath )
MsgBox( strValue )
  



この事を利用して、もし既定のスクリプトホストが、WScript であったなら、一時的に CScript に変更して
コマンドプロンプトを表示して別のスクリプトを実行して PAUSE するというプログラムを作成してみます

必ず CScript で実行されるスクリプト




  必ず CScript で実行されるスクリプト



以下のスクリプトは、表示を Wscript.Echo で行っている為、WScript で実行されると
メッセージボックスが何度も表示されてしまいます。
その為、Wscript では実行できないようにチェックをしています

  
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	strMessage = "コマンドプロンプトより cscript " & WScript.ScriptFullName
	strMessage = strMessage & " と指定して実行して下さい   " & vbCrLf & vbCrLf
	strMessage = strMessage & "( この文字列をクリップボードにコピーしたい場合は"
	strMessage = strMessage & " ctrl+c です )"
	WScript.Echo strMessage
	WScript.Quit
end if
' **********************************************************
' 実行中サービス一覧
' **********************************************************
strServer = "."

on error resume next
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

Set objWmi = objLocator.ConnectServer( _
	strServer, _
	"root\cimv2", _
	strUser, _
	strPass )
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

objWmi.Security_.ImpersonationLevel = 3
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

Set objTarget = objWmi.ExecQuery( _
 "select Name,Started,PathName from Win32_Service" _
)

on error resume next
For Each obj in objTarget

	if obj.Started then
		Wscript.Echo obj.Name
	end if

Next
on error goto 0
  

そこで、以下のような呼び出し用のスクリプトを作成します

  
Set WshShell = WScript.CreateObject( "WScript.Shell" )
Set Fso	= CreateObject( "Scripting.FileSystemObject" )

' **********************************************************
' 実行されているこのディレクトリを取得
' **********************************************************
strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

' **********************************************************
' チェック用の文字列を取得
' **********************************************************
strPath = "HKLM\SOFTWARE\Classes\VBSFile\Shell\Open\Command\"
strValue = WshShell.RegRead( strPath )

' **********************************************************
' Wscript なら、Cscript に変更
' **********************************************************
bWscript = False
if InStr( 1, strValue, "WSCRIPT", 1 ) > 0 then
	bWscript = True
	' コマンドプロンプトを開かない同期処理
	Call WshShell.Run( "cscript.exe /H:Cscript", 0, True )
end if

' **********************************************************
' 同期でコマンドプロンプトを開いて、PAUSE
' **********************************************************
strCommand = "cmd.exe /c """ & strCurPath
strCommand = strCommand & "\list_service_started.vbs"""
strCommand = strCommand & " & pause"
Call WshShell.Run( strCommand, , True )


' **********************************************************
' 元に戻す
' **********************************************************
if bWscript then
	Call WshShell.Run( "cscript.exe /H:Wscript", 0, True )
end if
  

WshShell.Run については、以下を参照して下さい
http://winofsql.jp/VA003334/vbsguide051215192026.htm










  infoboard   管理者用   
このエントリーをはてなブックマークに追加




SQLの窓  天気  IT用語辞典
Yahoo!ニュース  マルチ辞書
PHP マニュアル  Google URL短縮 


フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ