2017年04月21日


環境変数をセミコロンで区切って一つづつコマンドプロンプトに表示するバッチファイル path.bat

echo で VBScript の実行文を表示して、%temp%\_.vbs に書き出してそのまま実行するという、バッチファイルです。システム用とユーザ用を別々に作成して実行しています。

PATH コマンドの代りに使えます。
@echo off
echo ▼ システム
cmd /c echo Set ws=WScript.CreateObject("WScript.Shell"):Set wv=ws.Environment("SYSTEM"):pt=wv("PATH"):ad=Split(pt,";"):For I=0 To Ubound(ad):Wscript.echo ws.ExpandEnvironmentStrings(ad(I)):Next>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs
echo ▼ ユーザ
cmd /c echo Set ws=WScript.CreateObject("WScript.Shell"):Set wv=ws.Environment("USER"):pt=wv("PATH"):ad=Split(pt,";"):For I=0 To Ubound(ad):Wscript.echo ws.ExpandEnvironmentStrings(ad(I)):Next>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs
pause






posted by at 21:42 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする


2016年03月01日


テキストファイルの一括読み込み

Fso は事前に定義していてもいいですし、引数として渡して使用してもいいですが、このコードでは ErrorMessage と Fso がグローバル変数として関数内で定義されています。
Function GetTextFile( strPath )

	Dim ExecuteString
	Dim objHandle

	ExecuteGlobal "Dim ErrorMessage"

	ExecuteString = "Dim Fso : Set Fso = CreateObject( ""Scripting.FileSystemObject"" )"
	ExecuteGlobal ExecuteString

	ErrorMessage = ""
	on error resume next
	Set objHandle = Fso.OpenTextFile( strPath, 1 )
	if Err.Number <> 0 then
		ErrorMessage = Err.Description
		GetTextFile = ""
	else
		GetTextFile = objHandle.ReadAll
		objHandle.Close
	end if
	on error goto 0

End Function





posted by at 20:58 | Comment(0) | 関数 | このブログの読者になる | 更新情報をチェックする


2015年02月16日


URLEncode ( UTF-8 の文字列として全ての文字をパーセントエンコーディングします )

VBScript の内部コードから意図的に UTF-8 のキャラクタセットでテキストを書き込んで、バイナリストリームにコピーして、UTF-8 としてのバイトデータを1バイトづつ読み込んで『パーセントエンコーディング』で表現した文字列に変換しています。

※ UTF-8 として処理した場合、先頭3バイトは BOM なので取り除いています。
REM ***********************************************
REM UTF-8 のバイナリデータを作成して URLエンコード
REM ※ 全ての文字をパーセントエンコーディングします
REM ***********************************************
Function URLEncode(s1,s2, str)

	s1.Open
	s1.Charset = "utf-8"
	REM shift_jis で入力文字を書き込む
	s1.WriteText str
	REM コピーの為にデータポインタを先頭にセット
	s1.Position = 0

	REM バイナリで開く
	s2.Open
 	s2.Type = 1

	REM テキストをバイナリに変換
	s1.CopyTo s2
	s1.Close

	REM 読み込みの為にデータポインタを先頭にセット
	s2.Position = 0

	Dim Buffer : Buffer = ""
	REM BOMを取り去る
	s2.Read(3)
	Do while not s2.EOS
		LineBuffer = s2.Read(16)
 
		For i = 1 to LenB( LineBuffer )
			CWork = MidB(LineBuffer,i,1)
			Cwork = AscB(Cwork)
			Cwork = Hex(Cwork)
			Cwork = Ucase(Cwork)
			if Len(Cwork) <> 1 then
				Buffer = Buffer & "%" & Cwork
			else
				Buffer = Buffer & "%0" & Cwork
			end if
		Next
 
	Loop

	s2.Close

	URLEncode = Buffer

End Function

▼ 呼び出しサンプル
<JOB>
<OBJECT id="s1" progid="ADODB.Stream" />
<OBJECT id="s2" progid="ADODB.Stream" />

<SCRIPT language="VBScript" src="http://winofsql.jp/VBScript/urlencode.vbs"></SCRIPT>

<SCRIPT language="VBScript">

str = "あいうえお"

Wscript.Echo URLEncode(s1,s2, str)

</SCRIPT>
</JOB>

REM を使ったり、条件式の = を使わずに、<> を使っているのは、ExecuteGlobal を使って動的に関数登録する為です。
VBScript では、x = y の解釈が 2 とおりあります。1 つ目は代入ステートメントとして解釈され、y の値が x に代入されます。2 つ目は x と y の値が等しいかどうかをテストする式として解釈されます。等しい場合、result は True です。それ以外の場合、result は False です。ExecuteGlobal ステートメントは常に 1 つ目の解釈を適用し、Eval メソッドは常に 2 つ目の解釈を適用します。
posted by at 17:47 | Comment(0) | 関数 | このブログの読者になる | 更新情報をチェックする


2014年07月11日


VBScript で『管理者として実行を強制する』処理

freefont_logo_hkreikk.png
昨今の Windows では、管理者権限が無いと失敗する処理が増えました。これは、バッチで自動化する時には使用できませんが、PC の前に操作員が居るという前提で実行可能です。

この処理は、右クリックで表示されるメニューの中の『管理者として実行』という項目に該当し、本来の英語表示は『runas』であると思われ、スクリプトの Operation"runas" を引き渡すと実現できます。

Shell.ShellExecute method

注意するのは、以下のコードでは VBScript に対して引数がある場合は利用できないと言う事です。引数がある場合はその引数の数に合わせてカスタマイズする必要があります。

ここでは、引数が無いという前提なので、次に実行する場合はダミーで "runas" という引数を渡しています。WScript.ScriptFullName & " runas"wscript.exe に対する引数で、runas が スクリプトに対する引数です。

こうする事によって、2回目の実行は、管理者権限で実行されている状態で、if Wscript.Arguments.Count = 0 then を通り抜ける事になります。

ShellExecute の3番目の引数が省略されていますが、これは作業ディレクトリの指定で、このパラメータを指定しない場合、現在の作業ディレクトリが使用されます。

ShellExecute の5番目引数は、ウインドウの表示方法で、1 は、ノーマル表示を意味します。
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Wscript.Echo WScript.Arguments(0)





タグ:SHELL
posted by at 13:04 | Comment(0) | Shell.Application | このブログの読者になる | 更新情報をチェックする


2014年05月29日


WMIのレジストリアクセスで、レジストリエントリの一覧を取得する VBScript クラス

freefont_logo_hkreikk.png
WMI : StdRegProv class
VBScript のクラス : Initialize イベント

Private Sub Class_Initialize は、コンストラクタのような働きをしますが、イベントなので引数を使うコンストラクタを実装する事ができません。また、そもそも同名のメソッドを作成できないので、注意が必要です。

ここでは、デフォルトのメソッドを定義して、メソッド名を指定せずに処理を実行しています。

Set Shell = CreateObject("Shell.Application")
if WScript.Arguments.Count = 0 then
	Shell.ShellExecute "cmd.exe", "/c Cscript.exe """ & Wscript.ScriptFullName & """ dummy & pause", "", "runas", 1
	Wscript.Quit
end if

Dim obj

' ************************************************
' インスタンス作成
' ************************************************
Set obj = new Wmireg

' ************************************************
' デフォルトメソッド実行
' ************************************************
Set list = obj(WMI_HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run")

' ************************************************
' 一覧表示
' ************************************************
For Each data in list.Keys

	Wscript.Echo data & " : " & list(data)

Next

const WMI_HKEY_CLASSES_ROOT = &H80000000
const WMI_HKEY_CURRENT_USER = &H80000001
const WMI_HKEY_LOCAL_MACHINE = &H80000002
const WMI_HKEY_USERS = &H80000003
const WMI_HKEY_CURRENT_CONFIG = &H80000005

const WMI_REG_SZ = 1 
const WMI_REG_EXPAND_SZ = 2 
const WMI_REG_BINARY = 3 
const WMI_REG_DWORD = 4 
const WMI_REG_MULTI_SZ = 7 

Class Wmireg

	Public objReg 

	' ************************************************
	' Initialize イベント
	' ************************************************
	Private Sub Class_Initialize

		Set objReg = _
			GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
			".\root\default:StdRegProv") 

	End Sub

	' ************************************************
	' サブキーの配列を取得
	' ************************************************
	Public Function GetLSubKeyArray( defKey, strPath )

		Dim aSubKeys,str

		objReg.EnumKey defKey, strPath, aSubKeys
		GetLSubKeyArray = aSubKeys
	 
	end function

	' ************************************************
	' 値の一覧の連想配列を取得( 規定のメソッド )
	' ************************************************
	Public Default Function GetLValueArray( defKey, strPath )

		Dim aValueNames, aValueTypes, strValue, aValue

		Set var = CreateObject( "Scripting.Dictionary" )

		objReg.EnumValues defKey, strPath,_ 
			aValueNames, aValueTypes 
		For i=0 To UBound(aValueNames)
			Select Case aValueTypes(i) 
				Case WMI_REG_SZ
					objReg.GetStringValue _
					defKey,strPath,aValueNames(i),strValue
					var(aValueNames(i)) = strValue
				Case WMI_REG_EXPAND_SZ
					objReg.GetExpandedStringValue _
					defKey,strPath,aValueNames(i),strValue
					var(aValueNames(i)) = strValue
				Case WMI_REG_DWORD
					objReg.GetDWORDValue _
					defKey,strPath,aValueNames(i),strValue
					var(aValueNames(i)) = strValue
				Case WMI_REG_MULTI_SZ
					objReg.GetMultiStringValue _
					defKey,strPath,aValueNames(i),aValue
					var(aValueNames(i)) = aValue
				Case WMI_REG_BINARY 
					objReg.GetBinaryValue _
					defKey,strPath,aValueNames(i),aValue
					var(aValueNames(i)) = aValue
			End Select 
		Next 

		Set GetLValueArray = var

	end function

	' ************************************************
	' 文字列セット
	' ************************************************
	Public Function SetLString( defKey, strPath, strName, strValue )

		objReg.SetStringValue _
			defKey,strPath,strName,strValue 

	end function

	' ************************************************
	' 整数セット
	' ************************************************
	Public Function SetLDword( defKey, strPath, strName, dwValue )

		objReg.SetDWORDValue _
			defKey,strPath,strName,dwValue

	end function

End Class



タグ:WMI クラス
posted by at 01:41 | Comment(0) | WMI | このブログの読者になる | 更新情報をチェックする


2014年01月09日


BatchHelperオブジェクト(32bit)のインストール

BatchHelper オブジェクトのメソッド等使用方法


インストーラのダウンロード

解凍して、setup.wsf を実行します。
<JOB>
<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fs" progid="Scripting.FileSystemObject" />
<OBJECT id="Shell" progid="Shell.Application" />
<SCRIPT language=VBScript>
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Set obj = GetObject ("winmgmts:\\.\root\cimv2")
Set objTargets = obj.ExecQuery( "select AddressWidth from Win32_Processor" )
Dim str
For Each objTarget in objTargets
	str = objTarget.AddressWidth
Next

strCurPath = WScript.ScriptFullName
Set obj = Fs.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

Dim Lbox,bLbox,strDir,objExec

Set objFolder = Shell.Namespace( &H25 )
Set objFolderItem = objFolder.Self
strDir = objFolderItem.Path

if str <> "32" then
	strDir = Replace(Ucase(strDir),"SYSTEM32", "SYSWOW64")
end if

Wscript.Echo "インストール先 : " & strDir

on error resume next
' インストールされているかどうか
strValue = WshShell.RegRead("HKCR\Lbox.BatchHelper\CLSID\")
if Err.Number = 0 then
	' 現在の情報でアンインストール
	strValue = "HKCR\CLSID\" & strValue
	strValue = strValue & "\InprocServer32\"
	strValue = WshShell.RegRead(strValue)
	strValue = strDir & "\regsvr32.exe /u /s """ & strValue & """"
	Call WshShell.Run( strValue,,true )
end if
on error goto 0

' カレントファイルをシステムディレクトリにコピー
Call Fs.CopyFile( strCurPath & "\lbox.dll", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\BatchWsc.wsc", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\imgctl.dll", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\SaveJPG.dll", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\TransG32.dll", strDir & "\", True )

' lbox.dll のインストール
strValue = strDir & "\regsvr32.exe """ & strDir & "\lbox.dll"""
Call WshShell.Run( strValue,,true )

on error resume next
strValue = WshShell.RegRead("HKCR\Lbox.BatchWsc\CLSID\")
if Err.Number = 0 then
	' 現在の情報でアンインストール
	strValue = "HKCR\CLSID\" & strValue
	strValue = strValue & "\ScriptletURL\"
	strValue = WshShell.RegRead(strValue)
	strValue = strDir & "\regsvr32.exe scrobj.dll /s /u /n /i:""" & strValue & """"
	Call WshShell.Run( strValue,,true )
end if
on error goto 0

' BatchWsc.wsc のインストール
strValue = strDir & "\regsvr32.exe scrobj.dll /n /i:file://""" & strDir & "\BatchWsc.wsc" & """"
Call WshShell.Run( strValue,,true )

</SCRIPT>
</JOB>

▼ 以下のようにファイルがシステムディレクトリにコピーされます
' カレントファイルをシステムディレクトリにコピー
Call Fs.CopyFile( strCurPath & "\lbox.dll", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\BatchWsc.wsc", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\imgctl.dll", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\SaveJPG.dll", strDir & "\", True )
Call Fs.CopyFile( strCurPath & "\TransG32.dll", strDir & "\", True )

アンインストールは、uninstall.wsf を実行して下さい。( レジストリの情報を削除します )

以下は、ファイルを開くダイアログの使用例です( 単一ファイルと複数選択 )
Set obj = GetObject ("winmgmts:\\.\root\cimv2")
Set objTargets = obj.ExecQuery( "select AddressWidth from Win32_Processor" )
Dim str
For Each objTarget in objTargets
	str = objTarget.AddressWidth
Next

if str <> "32" then
	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	if str <> "CSCRIPT.EXE" then
		str = WScript.ScriptFullName
		Set WshShell = Wscript.CreateObject("WScript.Shell")
		strParam = " "
		For I = 0 to Wscript.Arguments.Count - 1
			if instr(Wscript.Arguments(I), " ") < 1 then
				strParam = strParam & Wscript.Arguments(I) & " "
			else
				strParam = strParam & """" & Wscript.Arguments(I) & """ "
			end if
		Next
		Call WshShell.Run( "c:\windows\SYSWOW64\cmd.exe /c c:\windows\SYSWOW64\cscript.exe """ & str & """" & strParam & " & pause", 3 )
		WScript.Quit
	end if
end if

Set BatchHelper = Wscript.CreateObject( "Lbox.BatchHelper" )

' 単一ファイルの選択
Path = BatchHelper.OpenFileName( _
	"ファイルを開く", _
	"テキスト,*.txt,ログ,*.log,全て,*.*", _
	"C:\Windows\Microsoft.NET\Framework" )

' キャンセルは、空文字が返されます
if Path <> "" then
	BatchHelper.MsgOk( "ファイルが選択されました : " & vbCrLf & Path )
end if

' 複数ファイルの選択
Path = BatchHelper.OpenFileNames( _
	"複数ファイルの選択", _
	"テキスト,*.txt,ログ,*.log,全て,*.*", _
	"C:\Windows\Microsoft.NET\Framework" )

' キャンセルは、空文字が返されます
if Path <> "" then
	BatchHelper.MsgOk( "ファイルが選択されました : " & vbCrLf & Path )

	' 複数のファイルのパスは、TABコードで分割されます
	aData = Split(Path, vbTab)
	BatchHelper.MsgOk("/" & aData(0) & "/")
end if




posted by at 18:18 | Comment(0) | BatchHelper | このブログの読者になる | 更新情報をチェックする


2013年12月05日


VBScript で標準的に「ファイルを開く」ダイアログを利用する唯一の方法

フォーカス(アクティブ)の問題とか、一般にファイルの種類は指定できないので不完全ではありますが、自分でアプリケーションを作成せずに利用する事ができます。

元々、ファイルのアップロードのみに使われるものですからそのような目的でしか利用する事はできません( ファイルの保存用はありません )

' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Function OpenLocalFileName( )

	' ファイルシステムを操作するオブジェクト
	Set Fso = WScript.CreateObject( "Scripting.FileSystemObject" )
	' テンポラリフォルダ
	TempDir =  Fso.GetSpecialFolder(2)
	on error resume next
	' テンポラリフォルダに空の "local.htm" を作成
	Set objHandle = Fso.CreateTextFile( TempDir & "\local.htm", True, True )
	if Err.Number <> 0 then
		Exit Function
	end if
	objHandle.Close
	on error goto 0

	' IE を操作するオブジェクト
	Set IEDocument = WScript.CreateObject( "InternetExplorer.Application" )
	' テンポラリフォルダに作成したファイルを開く
	IEDocument.Navigate( TempDir & "\local.htm" )
	' 『ファイルを開く』為のコンテンツを作成
	IEDocument.document.getElementsByTagName("BODY")(0).innerHTML = "<input id=FilePath type=file>"
	' 『ファイルを開く』為に、ボタンをクリックする
	IEDocument.document.getElementById("FilePath").click
	' ファイルを選択していない場合は終了
	if IEDocument.document.getElementById("FilePath").value = "" then
		OpenLocalFileName = ""
		IEDocument.Quit
		Set IEDocument = Nothing
		Exit Function
	end if

	' 選択したファイルのパスを戻す
	OpenLocalFileName = IEDocument.document.getElementById("FilePath").value

	' IE を終了
	IEDocument.Quit
	Set IEDocument = Nothing

End Function


' 呼び出し
strValue = OpenLocalFileName
if strValue = "" then
	Wscript.Quit
end if

' 選択したファイルを表示
Wscript.Echo strValue

昔はセキュリティが甘かったので、ローカルファイルでは無く about:blank で処理できていたのですが、今はインターネットオプションの『サーバーにファイルをアップロードするときにローカル ディレクトリのパスを含める』を有効にしないと、fakepath というパスのみが返るようになっています。それを回避する為にローカルのファイルを使うようにしていますが、その際に管理者権限でないと動作しないので、『管理者として実行を強制』しています

※ UserAccounts.CommonDialog は、XPのみで利用できます


BatchHelper オブジェクト をインストールすると以下が使用できます

【 OpenFileName 】
Path = BatchHelper.OpenFileName( [Title], [Filter], [DefaultDir], [DefaultExt], [DefaultName] )

コモンダイアログでファイルのパスを取得します 

Title (省略可): ダイアログのタイトル
Filter (省略可): フィルターリスト ( 例: "CSV,*.csv,全て,*.*" )
DefaultDir (省略可): 初期ディレクトリ
DefaultExt (省略可): デフォルトの拡張子
DefaultName (省略可): デフォルトのファイル名 

キャンセル時、Path は "" (空文字列) になります

▼ 実行ソースコードサンプル
Set BatchHelper = Wscript.CreateObject("Lbox.BatchHelper")

Path = BatchHelper.OpenFileName( )

Wscript.Echo Path




posted by at 00:01 | Comment(0) | その他 | このブログの読者になる | 更新情報をチェックする


2013年11月30日


架空氏名作成スクリプト

こちらは教育漢字です

選択する漢字によっては、さらに架空度が増します。
<JOB>
<OBJECT id="WshShell" progid="WScript.Shell" />
<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************
nMax = 20	' 取得する人数

Call Crun()

' 1、2 は教育漢字の最初
strName1 = "愛悪圧安暗案以位囲委意易異移胃衣遺医域育一印員因引飲院右宇羽"
strName2 = "雨運雲営映栄永泳英衛液益駅円園延沿演遠塩央往応横王黄億屋恩温"
strName3 = "男也一行樹之朗七人"
strName4 = "子代美恵"

For i = 1 to nMax

	' 姓1文字目
	nTarget = Random( 1, Len(strName1) )
	strName = Mid( strName1, nTarget, 1 )

	' 1文字目と2文字目が一致したら除外
	nTarget2 = nTarget
	Do while( nTarget = nTarget2 )
		nTarget2 = Random( 1, Len(strName1) )
	Loop

	' 姓2文字目
	strName = strName & Mid( strName1, nTarget2, 1 ) & " "

	' 名1文字目
	nTarget = Random( 1, Len(strName2) )
	strName = strName & Mid( strName2, nTarget, 1 )

	' 性別
	nTarget = Random( 0, 1 )

	' 性別によって名2文字目を決定
	if nTarget = 0 then
		nTarget = Random( 1, Len(strName3) )
		strName = strName & Mid( strName3, nTarget, 1 )
	else
		nTarget = Random( 1, Len(strName4) )
		strName = strName & Mid( strName4, nTarget, 1 )
	end if
	
	Wscript.Echo strName

Next

' ***********************************************************
' 範囲内ランダム値取得
' ***********************************************************
Function Random( nMin, nMax )

	Randomize
	Random = nMin + Int(Rnd * (nMax - nMin + 1))

End function

' ***********************************************************
' Cscript.exe で強制実行
' ***********************************************************
Function Crun( )

	Dim str

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	if str <> "CSCRIPT.EXE" then
		str = WScript.ScriptFullName
		strParam = " "
		For I = 0 to Wscript.Arguments.Count - 1
			if instr(Wscript.Arguments(I), " ") < 1 then
				strParam = strParam & Wscript.Arguments(I) & " "
			else
				strParam = strParam & Dd(Wscript.Arguments(I)) & " "
			end if
		Next
		Call WshShell.Run( "cmd.exe /c cscript.exe " & Dd(str) & strParam & " & pause", 3 )
		WScript.Quit
	end if

End Function

' ***********************************************************
' ダブルクォート
' ***********************************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function

</SCRIPT>
</JOB>




posted by at 03:19 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする


2013年11月28日


文字列連結では無く、配列を利用した VBScript のクラス

そもそも、VBScript のクラスが珍しいですが、ExecuteGlobal や、ReDim Preserve は、VBScript のテクニックとしてとても重要なステートメントです。実際大量に文字列連結すると、大きくなるほどハフォーマンスが落ちます。しかし、ReDim では単純なメモリの増量のようなので( C++ レベルではそんなに単純でも無いでしょうけれど )かなり高速に動作するはずです。

もっと複雑な処理では、Dictionary オブジェクトを使用すればいいとおもいますが、文字列を作成して処理するだけなら( 例えば HTA における HTML 作成 )こちらのほうが便利です。
Set MyBuffer = CreateBuff

Wscript.Echo MyBuffer.Length

MyBuffer.SetData("001")

Wscript.Echo MyBuffer.Length

MyBuffer.SetData("日本語表示")
MyBuffer.SetData("XYZ")

Wscript.Echo MyBuffer.Length

' 内部配列の直接参照
Wscript.Echo MyBuffer.Buff(1)
MyBuffer.Buff(1) = "日本語"

' 改行コードで連結した内部配列
Wscript.Echo MyBuffer.GetData(vbCrLf)

' カンマで連結した内部配列
Wscript.Echo MyBuffer.GetData(",")


Class buffCon

	Public Buff()

	' ************************************************
	' コンストラクタ
	' ************************************************
	Public Default Function InitSetting()

		Redim Buff(0)

	end function

	' ************************************************
	' メソッド ( データセット )
	' ************************************************
	function Length()

		if IsEmpty( Buff(0) ) then
			Length = 0
		else
			Length =  Ubound(Buff)+1
		end if

	end function

	' ************************************************
	' メソッド ( データセット )
	' ************************************************
	function SetData( strRow )

		if IsEmpty( Buff(0) ) then
			Buff(0) = strRow
		else
			ReDim Preserve Buff(Ubound(Buff)+1)
			Buff(Ubound(Buff)) = strRow
		end if

	end function
	 
	' ************************************************
	' メソッド ( データ取得 )
	' ************************************************
	function GetData( strDelim )

		GetData = Join( Buff, strDelim )

	end function

End Class

' **********************************************************
' バッファ作成
' **********************************************************
Function CreateBuff( )

	ExecuteString = "Dim gblCreateBuff : "
	ExecuteString = ExecuteString & "Set gblCreateBuff = new buffCon"
	ExecuteGlobal ExecuteString
	Call gblCreateBuff

	Set CreateBuff = gblCreateBuff

End Function




posted by at 23:16 | Comment(0) | サンプル | このブログの読者になる | 更新情報をチェックする


2013年11月27日


管理者として実行を強制し、ANHTTPD を実行し、MySQLサービスを起動し、 エクスプローラで ANHTTPD のディレクトリを開け、ブラウザで、ANHTTPD の仮想ディレクトリを開くスクリプト

昔、『開発始めますよスクリプト』と読んでいました。当時は、管理者で実行とか必要なかったですが、今はたぶんサービスの実行で権限を求められると思います。
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

' MySQL サービスの表示名(DisplayName)
Dim MySQL_Name : MySQL_Name = "MySQL56"
' ANHTTPD のインストールディレクトリ
Dim Httpd_Path : Httpd_Path = "c:\httpd142p"
' ANHTTPD の常に使う仮想パス
Dim Httpd_VPath : Httpd_VPath = "http://localhost"
' ブラウザのパス
Dim Browser_Path : Browser_Path = "C:\Program Files\Google\Chrome\Application\chrome.exe"


' **********************************************************
' アプリケーション起動用
' **********************************************************
Set WshShell = Wscript.CreateObject( "WScript.Shell" )

' **********************************************************
' プロセス( httpd.exe ) を開始
' **********************************************************
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'httpd.exe'") 
flg = false
For Each objProcess in colProcesses 
	flg = true
Next
if Not flg then
	WshShell.CurrentDirectory = Httpd_Path
	WshShell.Run( "httpd.exe" )
end if

' **********************************************************
' サービス( MySQL )
' **********************************************************
Set colRunningServices = objWMIService.ExecQuery("Select * from Win32_Service Where DisplayName = '" & MySQL_Name & "'") 
For Each objService in colRunningServices 
	if objService.State = "Stopped" then
		objService.StartService()
	end if
Next 

' **********************************************************
' ANHTTPD のインストールディレクトリをエクスプローラで開く
' **********************************************************
str = "explorer.exe /e," & Httpd_Path
WshShell.Run( str )


' **********************************************************
' ANHTTPD の常に使う仮想パス Google Chrome 
' **********************************************************
str = """" & Browser_Path & """"  & Httpd_VPath
WshShell.Run( str )



posted by at 05:36 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする