VBScript( Jscript ) を『管理者として実行する』には、Shell の runas ( 右クリックメニューの実行と同等 ) で実現

VBScript を『管理者として実行する』には、以下の内容ををスクリプトの先頭に記述します

🔻 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

Wscript.Echo "ここは管理者権限で実行されます"

🔻 Jscript

※ Jscript は WScript 等、大文字小文字の区別があるので注意です。
var obj = new ActiveXObject("Shell.Application");
if ( WScript.Arguments.length == 0 ) {
	obj.ShellExecute( "wscript.exe", WScript.ScriptFullName + " runas", "", "runas", 1 );
	WScript.Quit();
}

WScript.Echo( "ここは管理者権限で実行されます" );

Shell.ShellExecute method

これは、VBScript から利用可能な Shell の機能を使って、右クリックメニューにある『管理者として実行』を実行する方法です。ここでは日本語では無く runas と言う文字列を使って管理者として実行させています。

但し、引数がなかった場合の処理としては処理終了します。ですからこのスクリプトでは、引数をダミーで一つセットして( この場合一つめの runas がそうです )自分自身を再度呼び出しています。

つまり、Windows からすれば二度目の実行が管理者としての実行になります。

この場合は、スクリプトに引数を渡す事ができません。もし渡したい場合は、違ったトリックを使う必要があるのに注意して下さい。(その場合は、外部ファイルから入力するのがもっとも簡単で確実だと思います)




VBScript, 記録

コマンドプロンプトを『管理者権限』で実行する 8つの方法

Windowsキー + X のメニューから

タスクバーの左端を右クリックして表示されるメニューです。『コマンドプロンプト(管理者)』を使う事が可能です、無い場合は設定変更で表示できます。 【PowerShell を コマンドプロンプトに変更 ※説明あり

Windowsキー + S の検索から

cmd と入力して CTRL+SHIFT+Enter で管理者権限でコマンドプロンプトを表示できます

タスクマネージャーから

ファイルメニューより、新しいタスクの実行を選択する事で、管理者権限を付与してプログラムを実行できます

Windowsキー + R で cmd を実行してから

タスクバーに表示されている『コマンドプロンプト』を、CTRL+SHIFT を押しながらクリックします

ショートカット を作成してから

ショートカット作成時に cmd と入力すると参照後のショートカットが作成されます。そのショートカットを右クリックして『管理者として実行』を選択します。また、ショートカットタブの詳細設定より、『管理者として実行』をチェックしておくと常に管理者として実行できるようになります

VBScript を使う

Set obj = CreateObject("Shell.Application")
obj.ShellExecute "cmd.exe", "", "", "runas", 1


バッチファイル を使う

結局先ほどの VBScript のコードですが、バッチファイルにそれを作らして実行する事ができるので .bat として用意できます
@echo off
echo Set obj = CreateObject("Shell.Application"):obj.ShellExecute "cmd.exe", "", "", "runas", 1 > %TEMP%\_acmd.vbs
cscript %TEMP%\_acmd.vbs


PowerShell を使う

PowerShell そのものはいろいろ説明が面倒ですが、PowerShell を実行する時のオプションとして考えてもらうのが簡単です( エイリアスとかもありますけれど )
powershell -windowstyle hidden -command start cmd -verb runas

-windowstyle と -command は powershell のオプションで、start は powershell の内部コマンドである Start-Process のエイリアスで、-verb は start のオプションです

この場合、-windowstyle hidden はあっても無くてもあまり変わらないと思います。


JScript / VBScript : 指定したフォルダ内のフォルダ毎の使用済みサイズを読める範囲でレポートする

▼ JScript のダウンロード

▼ VBScript のダウンロード

System Volume Information は、無駄に使われてる場合が多いそうです。( 今日 5G 削除しました ) ✅ 参考ページ

show-folders-size.js

// ************************************************
// カンマ編集
// ************************************************
String.prototype.number_format = 
function (prefix) {
	var num = this.valueOf();
	prefix = prefix || '';
	num += '';
	var splitStr = num.split('.');
	var splitLeft = splitStr[0];
	var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '';
	var regx = /(\d+)(\d{3})/;
	while (regx.test(splitLeft)) {
		splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
	}
	return prefix + splitLeft + splitRight;
}

// ************************************************
// オブジェクト
// ************************************************
var Shell = new ActiveXObject("Shell.Application");
var WshShell = new ActiveXObject("WScript.Shell");
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );

// ************************************************
// 管理者権限のコマンドプロンプトで再実行
// ************************************************
if ( WScript.Arguments.length == 0 ) {
	Shell.ShellExecute( "cmd.exe", "/c cscript.exe " + Dd(WScript.ScriptFullName) + " next" + " & pause", "", "runas", 1 );
	WScript.Quit();
}


var target = SelectDir( "対象フォルダを選択して下さい" )
if ( target == "" ) {
	WScript.Quit();
}

WScript.Echo( target )

// ************************************************
// フォルダオブジェクト取得
// ************************************************
var objFolder =  Fso.GetFolder(target)

var folderCollection = new Enumerator(objFolder.SubFolders);

var TargetSize = 0;
var obj;
var num;
var line;
for ( ;!folderCollection.atEnd(); folderCollection.moveNext()) {

	obj = folderCollection.item();
	
	try {
		num = Math.floor(obj.Size / 1024) / 1024;
		num = Math.floor( num * 1000 ) / 1000
		line = Lpad(("" + num).number_format()," ", 15) + " M : " + obj.Name
		WScript.Echo( line );

		// フォルダ全体の合計
		TargetSize = TargetSize + obj.Size
	}
	catch(e) {
		WScript.Echo( obj.Name + " : 処理できません");
	}

}

WScript.Echo( "" );

num = Math.floor(TargetSize / 1024) / 1024;
num = Math.floor( num * 1000 ) / 1000
line = Lpad(("" + num).number_format()," ", 15) + " M : " + "表示合計"
WScript.Echo( line );

// ************************************************
// ディレクトリ選択
// ************************************************
function SelectDir( strTitle ) {

	var obj

	obj = Shell.BrowseForFolder( 0, strTitle, 0x4B, 0 )
	if ( obj == null ) {
		return "";
	}
	if ( !obj.Self.IsFileSystem ) {
		ErrorMessage = "ファイルシステムではありません";
		return "";
	}

	return obj.Self.Path;

}

// ************************************************
// ダブルクォートで囲む
// ************************************************
function Dd( strValue ) {

	return "\"" + strValue + "\""

}

// ************************************************
// 指定数、指定文字列左側を埋める
// ※少数以下3桁の調整
// ************************************************
function Lpad( strValue, str, nLen ) {

	var i;
	var wk = "";

	for( i = 0; i < nLen; i++ ) {
		wk += str;
	}
	
	var test = strValue.split(".");
	if ( test.length == 2 ) {
		if ( test[1].length == 0 ) {
			strValue += "000"
		}
		if ( test[1].length == 1 ) {
			strValue += "00"
		}
		if ( test[1].length == 2 ) {
			strValue += "0"
		}
	}
	else {
		strValue += ".000"
	}

	return ( wk + strValue ).slice( nLen * -1 );

}


show-folders-size.vbs

' ************************************************
' 管理者権限で実行用
' ************************************************
Set Shell = CreateObject( "Shell.Application" )

' ************************************************
' 管理者権限で再実行
' ************************************************
if Wscript.Arguments.Count = 0 then
	Shell.ShellExecute "cmd.exe", "/c cscript.exe " & Dd(WScript.ScriptFullName) & " next" & " & pause", "", "runas", 1
	Wscript.Quit
end if

' ************************************************
' 除外フォルダ名を スペースで区切って並べる
' (簡易的な除外)
' ************************************************
Dim Exclude
Exclude = ".gem"
Exclude = Lcase(Exclude)

' ************************************************
' 処理用
' ************************************************
Set WshShell = CreateObject( "WScript.Shell" )
Set Fso = CreateObject( "Scripting.FileSystemObject" )

Dim target

' ************************************************
' 対象フォルダを選択
' ************************************************
target = SelectDir( "対象フォルダを選択して下さい" )
if target = "" then
	Wscript.Quit
end if

Wscript.Echo target
Wscript.Echo

' ************************************************
' フォルダオブジェクト取得
' ************************************************
Set objFolder =  Fso.GetFolder(target)

' ************************************************
' サブフォルダコレクション取得
' ************************************************
Set colSubFolder =  objFolder.SubFolders

' ************************************************
' 一覧
' ************************************************
Dim TargetSize : TargetSize = 0
For Each obj in colSubFolder

	Do While true

		if InStr(Exclude,Lcase(obj.Name)) > 0 then
			Exit Do
		end if

		on error resume next
		Wscript.Echo Lpad(FormatNumber((Fix(obj.Size / 1024) / 1024),3)," ", 15) & " M : " & obj.Name
		if Err.Number <> 0 then
			Wscript.Echo "                  ( " & obj.Name & " : 処理できません )"
		else
			TargetSize = TargetSize + obj.Size
		end if
		on error goto 0


		Exit Do
	Loop


Next

Wscript.Echo

Dim AllSize
Dim er : er = 0
on error resume next
AllSize = objFolder.Size
if Err.Number <> 0 then
	er = 1
	AllSize	= TargetSize
end if
on error goto 0


Wscript.Echo Lpad(FormatNumber((Fix(TargetSize / 1024) / 1024),3)," ", 15) & " M : " & "表示合計"

if er = 1 then
	Wscript.Echo "                  ( " & target & " のサイズは取得できませんでした )"
else
	Wscript.Echo Lpad(FormatNumber((Fix(AllSize / 1024) / 1024),3)," ", 15) & " M : " & target & " のサイズ"
end if

Dim fsize : fsize = 0
For Each file in objFolder.files
	fsize = fsize + file.size
Next
Wscript.Echo Lpad(FormatNumber((Fix((fsize) / 1024) / 1024),3)," ", 15) & " M : " & target & " 下のファイル"

Wscript.Echo

' ************************************************
' ディレクトリ選択
' ************************************************
Function SelectDir( strTitle )

	Dim obj

	Set obj = Shell.BrowseForFolder( 0, strTitle, &H4B, 0 )
	if obj is nothing then
		SelectDir = ""
		Exit Function
	end if
	if not obj.Self.IsFileSystem then
		ErrorMessage = "ファイルシステムではありません"
		SelectDir = ""
		Exit Function
	end if

	SelectDir = obj.Self.Path

End Function

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

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

End function

' ************************************************
' 指定数、指定文字列左側を埋める
' ************************************************
Function Lpad( strValue, str, nLen )

	Lpad = Right( String(nLen,str) & strValue, nLen )

End Function






VBScript : WshShell.Runによる 【外部プログラムの実行】 のバリエーション

外部プログラムの実行

VBScript を何の為に使うかという場合、最も一般的に利用価値の高いのは、やはりプログラムの実行です。 わりと簡単に使えるのですが、プログラム(言語)でもあるので、専門知識が無ければ、なかなか難しい部分もあります。しかし、実行だけで言えば、2行で書けるので、その場合に「できること」を知っておくと絶対に得をします。

同期処理(コマンドプロンプトウインドウを開かない)

Set WshShell = WScript.CreateObject("WScript.Shell")
Call WshShell.Run( "zip.exe -r homepage D:\nifty\homepage", 0, True )


同期処理(コマンドプロンプトウインドウを開く)

Set WshShell = WScript.CreateObject("WScript.Shell")
Call WshShell.Run( "zip.exe -r homepage D:\nifty\homepage", , True )



非同期処理

Call WshShell.Run( "zip.exe -r homepage D:\nifty\homepage",0 ) でコマンドプロンプトウインドウは開きません
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run( "zip.exe -r homepage D:\nifty\homepage" )


関連するページ

WshShell.Run による外部プログラムの実行 :外部プログラムの実行

VBScript : GUID取得

Scriptlet.TypeLib で GUID を取得できます

▼ InternetExplorer.Application でクリップボードへコピーする

' GUID 取得用
Set TypeLib = CreateObject("Scriptlet.TypeLib")

' クリップボード用
' ※ HTA 等では直接 window.clipboardData より実行
' ※ するように書き換える必要があります
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
Do While objIE.Busy
	' 100 ミリ秒
	Wscript.Sleep 100
Loop

Call objIE.document.parentWindow.clipboardData.SetData( "Text", TypeLib.Guid & "" )
objIE.Quit

WScript.Echo "クリップボードにコピーしました" & vbCrLf & vbCrLf & TypeLib.Guid


▼ 自分でクリップボードへコピーする

' GUID 取得用
Set TypeLib = CreateObject("Scriptlet.TypeLib")

Call InputBox("コピーして使用して下さい","新しい GUID を取得しました",TypeLib.Guid)



▼ コマンドブロンプトを使う( clip.exe )

sCommand = "cmd /c echo Set TypeLib=CreateObject(""Scriptlet.TypeLib""):Wscript.echo TypeLib.Guid>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs | clip"

Set WshShell = WScript.CreateObject("WScript.Shell")
' 同期処理(コマンドプロンプトウインドウを開かない)
Call WshShell.Run( sCommand, 0, True )




VBScript : InternetExplorer.Application で、ファイルを開くダイアログを開く

管理者権限で実行する必要がある

昔から一般的に使われて来た方法ですが、ある時から about:blank では、fakepath というパスで返るようになって使えなくなっていました。そこで、ローカルにファイルを作ってそれで対処しています。但し、管理者権限で実行する必要があるので冒頭の処理が必要です。

簡易的な【ファイルを開くダイアログ】

ファイルの種類は設定できません。どうしても VBScript でファイルを開く為のダイアログを正しく使いたい場合は、COM を作成して呼び出す必要があります( exe に実行させて、ファイルで引き渡すと言う手もあります )。しかし、本来 VBScript で行う処理は簡易的なものなのでそこまでこだわる必要も無いのでこれで十分使えると思います。 冒頭の objShell.MinimizeAll は実行しておかないと、エクスプローラから実行した場合その下にファイルを開くダイアログが隠れてしまいます。 このソースは拡張子が .wsf 用です。
<JOB>
<SCRIPT language="VBScript">
' ************************************************
' 管理者として実行を強制する
' ************************************************
Set objShell = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	objShell.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

' ************************************************
' ファイルを開くダイアログの為に他を全て最小化する
' ************************************************
objShell.MinimizeAll

' ************************************************
' ファイル選択
' ************************************************
strValue = OpenLocalFileName
if strValue = "" then
	Wscript.Quit
end if

MsgBox( strValue )

' ************************************************
' InternetExplorer.Application でファイル選択
' ************************************************
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

	Set IEDocument = Wscript.CreateObject("InternetExplorer.Application")
	IEDocument.Navigate( TempDir & "\local.htm" )
	Do While IEDocument.Busy
		' 100 ミリ秒
		Wscript.Sleep 100
	Loop
	IEDocument.document.getElementsByTagName("BODY")(0).innerHTML = "<input id='FilePath' type='file'>"
	call 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

	IEDocument.Quit
	Set IEDocument = Nothing

End Function
</SCRIPT>
</JOB>




VBScript( Jscript ) を『管理者として実行する』には、Shell の runas ( 右クリックメニューの実行と同等 ) で実現します

UAC によるセキュリティの影響で VBScript を使う場合、管理者権限で実行しないとレジストリの一部には書き込めるのに重要なフォルダには書き込めないというような OS が決めたルールがあります。

それに対する対処の最も簡単な方法は、以下の内容ををスクリプトの先頭に記述する事です

🔻 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

Wscript.Echo "ここは管理者権限で実行されます"


🔻 Jscript

※ Jscript は WScript 等、大文字小文字の区別があるので注意です。 ※ ダウンロードは、拡張子 .htm で SHIFT_JIS ですので、利用時は .js に変更してお使い下さい。
var obj = new ActiveXObject("Shell.Application");
if ( WScript.Arguments.length == 0 ) {
	obj.ShellExecute( "wscript.exe", WScript.ScriptFullName + " runas", "", "runas", 1 );
	WScript.Quit();
}

WScript.Echo( "ここは管理者権限で実行されます" );

Shell.ShellExecute method

これは、VBScript から利用可能な Shell の機能を使って、右クリックメニューにある『管理者として実行』を実行する方法です。ここでは日本語では無く runas と言う文字列を使って管理者として実行させています。

但し、引数がなかった場合の処理としては処理終了します。ですからこのスクリプトでは、引数をダミーで一つセットして( この場合一つめの runas がそうです )自分自身を再度呼び出しています。

つまり、Windows からすれば二度目の実行が管理者としての実行になります。

この場合は、スクリプトに引数を渡す事ができません。もし渡したいしたい場合は、違ったトリックを使う必要があるのに注意して下さい。(その場合は、外部ファイルから入力するのがもっとも簡単で確実だと思います)





ADODB.Recordset を使用したメモリソート

Rs.Sort = "ソートキー,ソートデータ DESC"

VBScript だけではソートができないので、ADODB.Recordset を使用しています。ここでは、二つのフィールドを使って( SQL の構文で ) ソートしています。
' Null で終了する Unicode 文字列を示します (DBTYPE_WSTR)。
Const adWChar = 130

Dim Rs
Dim strResult

Set Rs = CreateObject("ADODB.Recordset")
Rs.Fields.Append "ソートキー", adWChar,128
Rs.Fields.Append "ソートデータ", adWChar,128
Rs.Open

Rs.AddNew
Rs.Fields("ソートキー").value = "C"
Rs.Fields("ソートデータ").value = "山田1"

Rs.AddNew
Rs.Fields("ソートキー").value = "C"
Rs.Fields("ソートデータ").value = "山田2"

Rs.AddNew
Rs.Fields("ソートキー").value = "A"
Rs.Fields("ソートデータ").value = "田中"

Rs.AddNew
Rs.Fields("ソートキー").value = "B"
Rs.Fields("ソートデータ").value = "鈴木"


' ****************************
' 順ソート + 逆ソート
' ****************************
Rs.Sort = "ソートキー,ソートデータ DESC"

' ****************************
' 先頭に移動
' ****************************
Rs.MoveFirst

strResult = ""
Do while not Rs.EOF

	strResult = strResult & Rs.Fields("ソートキー").Value & " : "
	strResult = strResult & Rs.Fields("ソートデータ").Value & vbCrLf

	Rs.MoveNext

Loop

' ****************************
' 順ソート結果を表示
' ****************************
Wscript.Echo strResult

' ****************************
' 逆ソート + 順ソート
' ****************************
Rs.Sort = "ソートキー DESC,ソートデータ"

' ****************************
' 先頭に移動
' ****************************
Rs.MoveFirst

strResult = ""
Do while not Rs.EOF

	strResult = strResult & Rs.Fields("ソートキー").Value & " : "
	strResult = strResult & Rs.Fields("ソートデータ").Value & vbCrLf

	Rs.MoveNext

Loop

' ****************************
' 逆ソート結果を表示
' ****************************
Wscript.Echo strResult

Rs.Close





VBScript : Cscript.exe で実行を強制する為の関数( Function Crun ) : Wscript.Echo で止まらないように

Wscript.Echo で止めない為に

WSH のテストをする場合エクスプローラからの起動が便利なわけですが、GUI を使用するとどうしても Wscript.exe が起動されて、デバッグの為に表示している Wscript.Echo が 実行毎にダイアログ表示になってしまいます。 これでは、ループ内で処理している場合等は悲惨な事になります。 そうならない為の関数です。

スクリプト自身から再度 Cscript.exe で実行させる

具体的には Cscript.exe で実行して無かった場合にコマンドプロンプトを開いて、そこから Cscript.exe で自分自身を実行させて、終了したら PAUSE します。( Wscript で実行されたスクリプトは終了させます ) ※ スクリプトへの引数は引継ぎます

サンプルコード( .vbs )

▼ 以下のコードでは、Crun 関数がその部分ですが、それを利用して『デスクトップのショートカットのアイコン情報』の一覧を表示しています。
Call Crun()

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

' デスクトップ
Set objFolder = Shell.NameSpace( 0 )

Set objFolderItems = objFolder.Items()
' 一覧の数
nCount = objFolderItems.Count

' デスクトップ一覧の列挙
For i = 0 to nCount - 1

	strPath = objFolderItems.Item(i).Path
	' パスをピリオドで分解
	aData  = Split( strPath, "." )
	' 配列の上限値より、一番右端にある拡張子を取得
	strTarget = aData( Ubound( aData ) )
	' 大文字に変換
	strTarget = Ucase( strTarget )

	' デスクトップのショートカットのアイコン情報を取得
	if strTarget = "LNK" then
		' ショートカットへのオブジェクト( 保存はしない )
		Set oShellLink = WshShell.CreateShortcut(strPath)
		strTarget = oShellLink.IconLocation
		' %変数名% で参照される環境変数を展開する
		strTarget = WshShell.ExpandEnvironmentStrings(strTarget)
		if strTarget = ",0" then
			' アイコンは、TargetPath の 0 番目のアイコンを使用
			Wscript.Echo oShellLink.TargetPath
		else
			' アイコンは、strTarget を , で分解して抽出
			Wscript.Echo strTarget
		end if
	end if

Next

' **********************************************************
' Cscript.exe で実行を強制
' Cscript.exe の実行終了後 pause で一時停止
' **********************************************************
Function Crun( )

	Dim str,WshShell

	' 実行中の WSH のフルパス
	str = WScript.FullName
	' 右から11文字取得
	str = Right( str, 11 )
	' 全て大文字に変更
	str = Ucase( str )
	' CSCRIPT.EXE でなければ処理を行う
	if str <> "CSCRIPT.EXE" then
		' 実行中の自分自身(スクリプト)のフルパスを取得
		str = WScript.ScriptFullName

		Set WshShell = 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 & Dd(Wscript.Arguments(I)) & " "
			end if
		Next
		' cscript.exe で実行しなおす為のコマンドラインを実行
		Call WshShell.Run( "cmd.exe /c cscript.exe " & Dd(str) & strParam & " & pause", 1 )
		' 実行中の自分自身(スクリプト)を終了
		WScript.Quit
	end if

End Function
' **********************************************************
' 文字列を " で囲む関数
' **********************************************************
Function Dd( strValue )

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

End function


Microsoft のドキュメント

Shell.NameSpace method ShellSpecialFolderConstants(0はデスクトップ) Folder.Items method CreateShortcut メソッド ExpandEnvironmentStrings メソッド WshShortcut オブジェクト のプロパティ

VBScriptの関数定義をWEB上に置いて、Msxml2.ServerXMLHTTP で読みだして PCで使用する

VBScriptの関数定義をWEB上に置いて、PCで使用する の発展版です。
※ WEB 上に置くソースコードは、上記リンク先を参照して下さい。

Msxml2.ServerXMLHTTP で読み出すコードの作成方法

Msxml2.ServerXMLHTTP は昔はバグがありましたが、今はとても優秀なオブジェクトです。ただ、相手側が静的ファイルの場合は UTF-8 扱いになるはずなので、PHP 側でキャラクタセットを明示しています。( 以下のサンプルの PHP / https://toolbox.winofsql.jp/vbs/regtrim.php は SHIFT_JIS です )
REM **********************************************************
REM 正規表現のトリム
REM **********************************************************
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function

このコードを regtrim.vbs や regtrim.txt としてWEB上のどこかに置く場合は、UTF8N で保存します


ExecuteGlobal による動的な関数の登録

読みだした後、ExecuteGlobal で文字列を実行してしまうのが特徴です。Global スコープで実行されるため、最初から定義していたのと同じ事になります。 但し、この処理を行う為に読みだされるソースコード側で注意する事があります 1) コメントにシングルクォートを使わないで REM を使う 2) 条件文で = を使わないで <> の else で表現する これらは、ExecuteGlobal が正しく VBScript の構文を解析する為に重要な準備事項になるので注意して下さい
<job>
<object id="http" progid="Msxml2.ServerXMLHTTP" /> 
<script language="VBScript">

' 関数のソースコードを読みだして、関数として定義
strResult = HTTPGet( "https://toolbox.winofsql.jp/vbs/regtrim.php" )
if not IsEmpty( strResult ) and Left( strResult, 3 ) = "REM" then
	' 関数定義の実行
	ExecuteGlobal strResult
else
	MsgBox( "処理できませんでした" )
	Wscript.Quit
end if

str = RegTrim( getResource( "mydata" ) )
MsgBox( "/" & str & "/" )

Function HTTPGet( strUrl )

	on error resume next
	Call http.Open("GET", strUrl, False )
	if Err.Number <> 0 then
		MsgBox(Err.Description)
		HTTPGet = Empty
		Exit Function
	end if
	on error goto 0

	Call http.Send()

	HTTPGet = http.responseText

End Function
</script>
<resource id="mydata">


    この部分のみ取り出します    


</resource>
</job>