SQLの窓

2011年12月16日


ユーザー環境変数の設定

PC名とユーザ名が必要です
' **********************************************************
' PC 名と ユーザ名を取得
' **********************************************************
Dim WshNetwork : Set WshNetwork = CreateObject( "WScript.Network" )
Dim strUser : strUser = WshNetwork.UserName
Dim strMachine : strMachine = WshNetwork.ComputerName

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


' **********************************************************
' ユーザ環境変数を登録
' **********************************************************
Dim objEnv : Set objEnv = obj.Get("Win32_Environment").SpawnInstance_

objEnv.Name = "MyENV"
objEnv.UserName = strMachine & "\" & strUser
objEnv.VariableValue = "設定しました"
objEnv.Put_



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



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

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 ドライバの列挙


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日


Seesaa の記事カテゴリをソートする IE拡張です

表示順フィールドで右クリックして使用します。

■ 単純実行 : カテゴリ名で単純ソート
■ +SHIFT : カテゴリ名で逆順ソート
■ +CTRL : 記事数の多い順

 インストーラです

( ダウンロードしてエクスプローラからダブルクリックして下さい )
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\Seesaa 用カテゴリソート]
@="c:\\laylaClass\\menuex\\Seesaa_catsort.htm"
"Contexts"=dword:00000004

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=SHIFT_JIS">
<title>Seesaa 用カテゴリソート</title>
<script language="VBScript">

	Dim RegName,obj,doc,win

	RegName = "Seesaa 用カテゴリソート"

	' SHIFTとCTRL用変数
	Dim keyflg1,keyflg2
	keyflg1 = False
	keyflg2 = False

Function setObj( src )
	Set obj = src
End Function
</script>
<script language="JavaScript">
setObj(external.menuArguments.event.srcElement);
</script>
<base target="_self">
</head>
<body>
<input id="btn" type=button onClick='keyflg1=window.event.shiftKey:keyflg2=window.event.ctrlKey'>
<script language="VBScript">

	' ボタンの呼び出し
	document.getElementById("btn").click()

	' ADO 用の定数
	Const adVarChar = 130	' Null で終了する Unicode 文字列
	Const adInteger = 3	' 4 バイトの符号付き整数

	' IEが表示しているページの document オブジェクト
	Set doc = external.menuArguments.document
	' IEが表示しているページの window オブジェクト
	Set win = external.menuArguments

	Dim colTable,objTable
	Dim colInput,colNum

	Set colInput = Nothing

	' テーブル要素の一覧
	Set colTable = doc.getElementsByTagName("TABLE")
	For Each objTable In colTable
		' カテゴリ一覧テーブルの選択
		if objTable.className = "list-table" then
			Set colInput = objTable.getElementsByTagName("A")
			Set colINum = objTable.getElementsByTagName("INPUT")
			Exit For
		end if
	Next

	Dim Rs,nCount,nMax,I,aData()

	' colInput は、対象テーブル内の A オブジェクト
	if Not colInput is Nothing then

		' A の数
		nCount = colInput.length
		' 仕様上2つで一行
		nMax = nCount / 2

		' ソート用レコードセット作成
		Set Rs = CreateObject("ADODB.Recordset")
		' メモリテーブルを作成
		' CTRL( 数値ソート )
		if keyflg2 then
			Rs.Fields.Append "ソートキー", adInteger
		' それ以外はカテゴリ名による文字列ソート
		else
			Rs.Fields.Append "ソートキー", adVarChar,255
		end if
		Rs.Fields.Append "順序", adInteger
		Rs.Open

		' データ保存
		For I = 0 to nMax - 1
			' 行追加
			Rs.AddNew
			' CTRL
			if keyflg2 then
				Rs.Fields("ソートキー").Value = Cint(colInput(I*2+1).firstChild.nodeValue)
			' カテゴリ名による文字列ソート
			else
				Rs.Fields("ソートキー").Value = colInput(I*2).firstChild.nodeValue
			end if
			Rs.Fields("順序").Value = I
			Rs.Update

		Next

		' ソート指定
		if keyflg1 or keyflg2 then
			' 逆ソート
			Rs.Sort = "ソートキー desc"
		else
			Rs.Sort = "ソートキー"
		end if

		' ポインタを先頭に移動
		Rs.MoveFirst

		' 配列を現在必要な数で動的作成
		ReDim aData(nMax)

		' 元の順序に現在の 順序x10+100 を設定
		I = 0
		Do while not Rs.EOF

			aData(Rs.Fields("順序").Value) = I*10 + 100

			Rs.MoveNext
			I = I + 1

		Loop

		' レコードセットを閉じる
		Rs.Close

		' 現在のフィールドにソート順序を設定
		For I = 0 to Ubound(aData) - 1

			colINum(I).Value = aData(I)

		Next

	end if

</script>
</body>
</html>

■ IE の機能を使って SHIFTキーと CTRLキーが押されたかを知る
■ JavaScript から VBScript の呼び出し( ここでは結果を使っていません )
■ ADO のメモリテーブルを使ってソートを行う


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



ショートカットの作成

.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のオブジェクト | このブログの読者になる | 更新情報をチェックする