2011年12月16日


システム環境変数とユーザー環境変数の列挙

select * from Win32_Environment where SystemVariable = True and Name = 'PATH'
というクエリで、SystemVariable を True にするとシステム変数です
Dim strValue : strValue = ""

Dim strComputer : strComputer = "."
Dim obj : Set obj = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")

' **********************************************************
' システム環境変数
' **********************************************************
Dim objItems : Set objItems = obj.ExecQuery _
   ("select * from Win32_Environment where SystemVariable = True and Name = 'PATH'")

Dim objItem
For Each objItem in objItems
	strValue = objItem.VariableValue
Next

Dim I,aData
if strValue <> "" then
	aData = Split( strValue, ";" )

	strValue = ""
	For I = 0 to Ubound( aData )
		strValue = strValue & aData(I) & vbCrLf
	Next

	Wscript.Echo strValue
end if

' **********************************************************
' ユーザー環境変数
' **********************************************************
Set objItems = obj.ExecQuery _
   ("select * from Win32_Environment where SystemVariable = False and Name = 'PATH'")

For Each objItem in objItems
	strValue = objItem.VariableValue
Next

if strValue <> "" then
	aData = Split( strValue, ";" )

	strValue = ""
	For I = 0 to Ubound( aData )
		strValue = strValue & aData(I) & vbCrLf
	Next

	Wscript.Echo strValue
end if




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



PC 名と ユーザ名を取得

VBScript では、Dim で変数を定義した時に初期値をセットできないので、
:(コロン) を使って横書きにして、同じような記述にしています
' **********************************************************
' PC 名と ユーザ名を取得
' **********************************************************
Dim WshNetwork : Set WshNetwork = CreateObject( "WScript.Network" )
Dim strUser : strUser = WshNetwork.UserName
Dim strMachine : strMachine = WshNetwork.ComputerName

Wscript.Echo strUser & " : " & strMachine



posted by at 08:44 | Comment(0) | WSHのオブジェクト | このブログの読者になる | 更新情報をチェックする



ADO を使ったメモリソート

Microsoft のドキュメントでは、255 を越える場合に可変長となると書かれていましたが、どうも違うようです。
' Null で終了する Unicode 文字列を示します (DBTYPE_WSTR)。
Const adWChar = 130

Dim Rs

Set Rs = Wscript.CreateObject("ADODB.Recordset")
' 127 までは固定長として扱われました
' 128 以上は可変長のはずです
Rs.Fields.Append "ソートキー", adWChar,128
Rs.Fields.Append "ソートデータ", adWChar,128
Rs.Open

Rs.AddNew
Rs.Fields("ソートキー").value = "C"
Rs.Fields("ソートデータ").value = "山田"
'Rs.Update : メモリ上なので無くても良いようです

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

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

Rs.Sort = "ソートキー"

Rs.MoveFirst

Dim strResult : strResult = ""
Do while not Rs.EOF

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

	Rs.MoveNext

Loop

Rs.Close

Wscript.Echo strResult


使用例

ODBC ドライバの列挙

Seesaa のカテゴリをソート(通常と逆順と記事が多い順)する VBScript で記述された IE 拡張


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



XMLファイルの更新

このような XML を読み込んでデータを追加した後、
新しいファイルとして保存します
<?xml version="1.0" encoding="UTF-8"?>
<channel>
	<item>
		<title>タイトル</title>
		<link>対象URL</link>
		<description>内容の説明</description>
		<date>2011-12-14</date>
	</item>
</channel>



※ 更新した結果を IE で表示すると以下のようになりました

' DOM Object 作成
Set dom = Wscript.CreateObject("Msxml2.DOMDocument")

' 既存 XML 入力
dom.load( "index.xml" )

' 既存のノード( channel ) を取得
Set nodeList = dom.getElementsByTagName("channel")

' 新規ノードを作成( createElement でも良い )
Set node = dom.createNode( 1, "item", "" )
' Set node = dom.createElement( "item" )

' **********************************************************
' title ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("title")
nodeChild.appendChild( dom.createTextNode("これは") )
node.appendChild( nodeChild )

' **********************************************************
' link ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("link")
nodeChild.appendChild( dom.createTextNode("SHIFT_JIS ですが") )
node.appendChild( nodeChild )

' **********************************************************
' description ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("description")
nodeChild.appendChild( dom.createTextNode("オブジェクトになると") )
node.appendChild( nodeChild )

' **********************************************************
' dc:date ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("date")
nodeChild.appendChild( dom.createTextNode("内部コードに変換されます") )
node.appendChild( nodeChild )


' channel ノードは、一つしか無いので、nodeList(0) で参照
' channel ノードの下に item ノードを追加
nodeList(0).appendChild( node )

' 保存
dom.save( "index2.xml" )



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


2011年12月12日


実行されているスクリプトが存在するディレクトリのフルパスを取得する

strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, "\" & WScript.ScriptName, "" )

でも動作しますが、以下のほうが正統派だとは思います
Dim Fso,obj,strCurPath

' ファイルシステムオブジェクト
Set Fso = CreateObject( "Scripting.FileSystemObject" )

' 現在実行されているスクリプトのフルパス
strCurPath = WScript.ScriptFullName

' ファイルオブジェクトを作成
Set obj = Fso.GetFile( strCurPath )

' ファイルオブジェクトが存在するフォルダオブジェクト
Set obj = obj.ParentFolder

' そのフォルダのフルパス
strCurPath = obj.Path

Wscript.Echo strCurPath





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


2011年11月20日


プリンタ名の一覧

item.Name は FolderItem オブジェクトのプロパティです
FolderItem Properties (Windows)
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(&H4)
Set colItems = objFolder.Items

For each item in colItems

	if item.Name <> "プリンタの追加" then
		Wscript.Echo item.Name
	end if

Next





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


2011年10月16日


VBScript の整数の入った配列をJavaScriptを使ってソートする

一つのソースで VBScript と JavaScript を混在させる必要があるので、
ソースは .wsf の形式で記述します。

JavaScript では、VBArray というオブジェクトがあるので、それを使っ
て少なくとも JavaScript 側で VBScript の配列をソートする事は容易
です。

ただ、それを戻す方法が直接には無いのでカンマ区切りの文字列にして
VBScript 側に返して、VBScript 側ではその文字列を分解してから整数
に戻して使用します
<job>
<script language="JavaScript">

// ***********************************************************
// VBの整数値の入った配列をソートして文字列で返す
// ***********************************************************
function js_sort(aData) {

	var vb_obj = new VBArray(aData);

	var js_array = vb_obj.toArray();

	js_array.sort(sortFunction);

	var str = ""

	var i

	for( i = 0; i <= vb_obj.ubound(); i++ ) {
		if ( i != 0 ) {
			str += ","
		}
		str += js_array[i];
	}

	return str

}
// ***********************************************************
// 数値用の比較関数
// ***********************************************************
function sortFunction(a,b) {

	if( parseInt((a+"")) < parseInt((b+"")) ) {
		return -1;
	}
	if( parseInt((a+"")) > parseInt((b+"")) ) {
		return 1;
	}
	return 0;
}

</script>
<script language="VBScript">
' ***********************************************************
' 処理開始
' ***********************************************************

' 配列の準備
Dim aData(10)

' 単純に値をセット
aData(0) = 5
aData(1) = 1
aData(2) = 2
aData(3) = 6
aData(4) = 3
aData(5) = 4
aData(6) = 7
aData(7) = 10
aData(8) = 9
aData(9) = 8
aData(10) = 11

' ソートされた文字列を取得
str = js_sort( aData )

' 文字列として一旦分解
aData2 = Split(str,",")

' 正数値として入れ直す
For I = 0 to Ubound(aData2)
	aData2(I) = CLng(aData2(I))
Next

' 確認
For I = 0 to Ubound(aData2)
	Wscript.Echo aData2(I) * 10
Next

</script>

</job>



タグ:ソート
posted by at 21:54 | Comment(0) | JavaScript利用 | このブログの読者になる | 更新情報をチェックする


2011年10月14日


ショートカットの作成

.lnk ファイルに対して Windows はファイルのパスを引数として渡すことを考慮する必要があります。ここでは、dump.vbs 35 の後ろにファイルのパスが追加されて実行されます。

※ この例は、SendTo(送る) フォルダにショートカットが置かれています
strSendto = WshShell.SpecialFolders("SendTo")
Set oShellLink = WshShell.CreateShortcut(strSendto & "\簡易ダンプ.lnk")

oShellLink.TargetPath = "%windir%\system32\wscript.exe"
' 引数の定義
oShellLink.Arguments = "dump.vbs 35"
oShellLink.WindowStyle = 1
oShellLink.IconLocation = "%SystemRoot%\system32\SHELL32.dll,55"
oShellLink.Description = "作成者 : lightbox"
oShellLink.WorkingDirectory = "dump.vbsが存在するパス"
oShellLink.Save


Microsoft の詳細ドキュメント

WshShortcut オブジェクト


posted by at 14:53 | Comment(0) | WSHのオブジェクト | このブログの読者になる | 更新情報をチェックする



エクスプローラ(explorer.exe) の再起動

目的としては、システムへの変更を作業環境に反映させる為に行います。

例えば、レジストリを変更してショートカットの名前は拡張子 .lnk が付いているのですが、一般的に表示される事はありません。

レジストリの HKEY_CLASSES_ROOT\lnkfile の中のエントリである NeverShowExtを名称変更すると、そのエントリが無い事になって .lnk が表示されるようになるのですが、エクスプローラを再起動するとすぐに反映されます。

※ 名称変更はすぐ戻せるように、名前の最後に _ を付加しておくといいと思います
' **********************************************************
' エクスプローラ(explorer.exe) の再起動
' **********************************************************
strTarget = "explorer.exe"

' 起動用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' いったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = '"&strTarget&"'") 
For Each objProcess in colProcessList
	on error resume next
	' 通常はこれで終了されるはず
	objProcess.Terminate() 
	if Err.Number <> 0 then
		' もし終了できなかった場合の強制終了
		Call WshShell.Run("taskkill /F /PID " & objProcess.ProcessId, 0 ) 
	end if
	on error goto 0
Next 

' 少し待ちます
Wscript.Sleep(500)
' エクスプローラを起動
WshShell.Run( strTarget )




タグ:プロセス WMI
posted by at 14:24 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする



OpenSchema によるテーブル名一覧の取得

■ ADO の定数を使えるように、.wsf で実行し、REFERENCE を定義しています
■ Wscript で実行してしまった場合は、CScript での実行に切り替えます
■ スクリプトと同じ場所にある 販売管理B.mdb を使用しています
■ VIEW のみの表示では、制約列を使用して読み出す情報を制限しています
table_list.wsf
<JOB>
<REFERENCE object="ADODB.Connection" />
<SCRIPT language="VBScript">

' Wscript の場合は実行しなおし
Set WshShell = CreateObject( "WScript.Shell" )
Dim str : str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	Call WshShell.Run( _
		"cmd.exe /c cscript.exe " & _
		"""" & WScript.ScriptFullName & _
		""" & pause", _
		3 )
	WScript.Quit
end if

' スクリプトが存在するディレクトリ
Set Fso = CreateObject( "Scripting.FileSystemObject" )
strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

strMDBPath = strCurPath & "\販売管理B.mdb"

' 接続
Set Cn = CreateObject("ADODB.Connection")
strConnection = _
	"Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source="&strMDBPath&";"
Cn.Open strConnection

' テーブル一覧のレコードセット
Wscript.Echo adSchemaTables & vbCrLf	' 20 : REFERENCE 要素で参照可能になっています
Set Rs = Cn.OpenSchema( adSchemaTables )

' スキーマのフィールド表示
strData = ""
For i = 0 to Rs.Fields.Count - 1
	Wscript.Echo Rs.Fields( i ).Name & ""
Next
Wscript.Echo

' テーブル一覧
Do while NOT Rs.EOF
	Wscript.Echo Rs.Fields( "TABLE_NAME" ).Value & ""
	Rs.MoveNext
Loop
Wscript.Echo

' ビューのみの一覧のレコードセット
Set Rs = Cn.OpenSchema( adSchemaTables, Array( Empty, Empty, Empty, "VIEW" ) )

' テーブル一覧
Do while NOT Rs.EOF
	Wscript.Echo Rs.Fields( "TABLE_NAME" ).Value & ""
	Rs.MoveNext
Loop

Rs.Close
Cn.Close

</SCRIPT>
</JOB>

table_list.wsf の実行結果


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