CX's VBScript Diary

2014-12-24

cx2020141224

VBScript + WIA を使って画像ファイルを作成する方法

22:45 | VBScript + WIA を使って画像ファイルを作成する方法 - CX's VBScript Diary を含むブックマーク はてなブックマーク - VBScript + WIA を使って画像ファイルを作成する方法 - CX's VBScript Diary

最近ですが、WindowsWindows Image Acquisition (WIA) という COM コンポーネントが含まれていることを知りました。

これを応用して、VBScript から画像ファイルを生成してみたいと思います。

' File : CreateMarioImage.vbs
' Usage : CScript //Nologo CreateMarioImage.vbs
' Description : VBScript で画像データを生成するサンプル。

Option Explicit

' ‥‥‥‥〓〓〓〓〓〓〓‥‥□□□
' ‥‥○○〓〓〓〓〓〓〓〓‥□□□
' ‥‥○○‥○○○○○○○○○□□
' ‥‥‥‥‥■■■□□■□‥○○○
' ‥‥‥‥■□■□□□■□□■■■
' ‥‥‥‥■□■■□□□■□□□■
' ‥‥‥‥■■□□□□■■■■■‥
' ‥‥‥‥‥‥□□□□□□□■‥‥
' ‥‥■■■■■■■○■■■‥‥‥
' ‥○■■■■■■■■■■■‥‥■
' □□○■■■■■■○■■■‥‥■
' □□□‥■■■■■■■○○■■■
' ‥□‥○○○○○○○○■■■■■
' ‥‥■■■■■■■■■■■■■■
' ‥■■■■■■■■■■‥‥‥‥‥
' ‥■‥‥■■■■‥‥‥‥‥‥‥‥
Dim dataSet
dataSet = Array( _
    "無","無","無","無","赤","赤","赤","赤","赤","赤","赤","無","無","肌","肌","肌", _
    "無","無","白","白","赤","赤","赤","赤","赤","赤","赤","赤","無","肌","肌","肌", _
    "無","無","白","白","無","白","白","白","白","白","白","白","白","赤","肌","肌", _
    "無","無","無","無","無","茶","茶","茶","肌","肌","茶","肌","無","白","白","白", _
    "無","無","無","無","茶","肌","茶","肌","肌","肌","茶","肌","肌","赤","赤","赤", _
    "無","無","無","無","茶","肌","茶","茶","肌","肌","肌","茶","肌","肌","肌","赤", _
    "無","無","無","無","茶","茶","肌","肌","肌","肌","茶","茶","茶","茶","赤","無", _
    "無","無","無","無","無","無","肌","肌","肌","肌","肌","肌","肌","赤","無","無", _
    "無","無","赤","赤","赤","赤","赤","赤","赤","赤","白","赤","赤","無","無","無", _
    "無","白","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","無","無","茶", _
    "肌","肌","白","赤","赤","赤","赤","赤","赤","赤","白","赤","赤","無","無","茶", _
    "肌","肌","肌","無","赤","赤","赤","赤","赤","赤","赤","赤","白","白","茶","茶", _
    "無","肌","無","白","白","白","白","白","白","白","白","白","赤","赤","茶","茶", _
    "無","無","茶","茶","茶","赤","赤","赤","赤","赤","赤","赤","赤","赤","茶","茶", _
    "無","茶","茶","茶","赤","赤","赤","赤","赤","赤","赤","無","無","無","無","無", _
    "無","茶","無","無","赤","赤","赤","赤","無","無","無","無","無","無","無","無" _
)

Function GetRgbColor( c ) 
    Dim colorHash
    Set colorHash = CreateObject("Scripting.Dictionary")
    colorHash.Add "無", &hFF000000
    colorHash.Add "白", &hFFFFFFFF
    colorHash.Add "肌", &hFFFFCCCC
    colorHash.Add "茶", &hFF800000
    colorHash.Add "赤", &hFFFF0000
    colorHash.Add "黄", &hFFFFFF00
    colorHash.Add "緑", &hFF00FF00
    colorHash.Add "水", &hFF00FFFF
    colorHash.Add "青", &hFF0000FF
    colorHash.Add "紫", &hFF800080

    GetRgbColor = colorHash( c )
End Function

Call Main()

Sub Main()
    Dim vec
    Set vec = CreateObject("WIA.Vector")
    
    Dim color
    Dim i
    For i = 0 To UBound(dataSet)
        color = GetRgbColor( dataSet(i) )
        vec.Add color
    Next
    
    Dim img
    Set img = vec.ImageFile(16, 16)
    img.SaveFile "C:\home\edu\vbscript\WIA\hello\mario.bmp"
End Sub
  • 実行結果

<参考>

■ Create an ImageFile Object that Contains a Blank Page

http://msdn.microsoft.com/en-us/library/windows/desktop/ms630826(v=vs.85).aspx#SharedSample029

2014-04-30

IE も FTP も PowerShell も使わずに Firefox をゲットする方法

23:24 | IE も FTP も PowerShell も使わずに Firefox をゲットする方法 - CX's VBScript Diary を含むブックマーク はてなブックマーク - IE も FTP も PowerShell も使わずに Firefox をゲットする方法 - CX's VBScript Diary

' File : GetFF.vbs
' Usage : CScript GetFF.vbs
Set http = Createobject("WinHttp.WinHttpRequest.5.1")
Set stm = Createobject("ADODB.Stream")
http.Open "GET", "http://download.mozilla.org/?product=firefox-29.0&os=win&lang=ja"
http.Send
stm.Type = 1
stm.Open
stm.Write http.ResponseBody
stm.SaveToFile "FirefoxSetup29.exe"

f:id:cx20:20140430232247p:image

2013-08-01

IE11 における VBScript サポートについて

03:05 | IE11 における VBScript サポートについて - CX's VBScript Diary を含むブックマーク はてなブックマーク - IE11 における VBScript サポートについて - CX's VBScript Diary

IE9/10 では、特段、設定変更なく、VBScript を使用することが可能でしたが、

IE11 では既定の設定で VBScript を使用することが出来ないようです。

Vbscript support in Internet Explorer 11 - Stack Overflow

http://stackoverflow.com/questions/17483782/vbscript-support-in-internet-explorer-11/

以下のコードは、IE10 では動作しますが IE11 では動作しません。

<html>
<body >
<script type="text/javascript">
alert ('Javascript');
</script>
<script type="text/vbscript">
msgbox "Vbscript"
</script>
</body>
</html>

これを回避する為には、明示的にドキュメント互換モードを指定する必要があるようです。

<meta http-equiv="x-ua-compatible" content="IE=10">

<参考情報>

ドキュメントモードと利用可能な機能の関係

ドキュメントモードVBScriptJavaScriptCanvasWebGL
7.0××
9.0×
10.0×
11.0×

IE9 以降、ブラウザ内部にJavaScriptChakra)エンジンが統合され、

旧来の JScript / VBScript は蚊帳の外(ブラウザからは COM 経由での呼出し)となっていましたが、

いよいよ、デフォルトで呼出しが出来なくなって来ているようです。

残念ですが、時代の流れのようです。。。

<関連情報>

■ 青柳 臣一 ブログ(技術系): [IE9] ついに ActiveX Scripting Engine がお払い箱に!

http://shinichiaoyagi.blogspot.jp/2010/08/ie9-activex-scripting-engine.html

JavaScriptエンジンが改良されたIE9 Platform Preview 4公開 - Publickey

http://www.publickey1.jp/blog/10/javascriptie9_platform_preview_4.html

HTML5, Modernized: Fourth IE9 Platform Preview Available for Developers - IEBlog - Site Home - MSDN Blogs

http://blogs.msdn.com/b/ie/archive/2010/08/04/html5-modernized-fourth-ie9-platform-preview-available-for-developers.aspx

2013-02-28

cx2020130228

VBScript + HTA(HTML Application)で Canvas を使う方法

04:58 | VBScript + HTA(HTML Application)で Canvas を使う方法 - CX's VBScript Diary を含むブックマーク はてなブックマーク - VBScript + HTA(HTML Application)で Canvas を使う方法 - CX's VBScript Diary

IE9/10 環境であっても、HTA のドキュメント互換モードがレガシーな設定となっている為、既定では HTML5Canvas 機能が使用できません。

ただし、互換モード(X-UA-Compatible)を明示的に「IE=edge」(最新のモード※)と指定することで、Canvas が使えるようになります。

(※IE11以降ではVBScriptが利用不可な為、「IE=10」のようにバージョンを指定する必要があります。)

<meta http-equiv="X-UA-Compatible" content="IE=edge">

実行環境とドキュメント互換モードの関係

実行環境 / 互換モード既定IE=edgeIE=9IE=10IE=11
IE99.09.09.09.09.0
IE1010.010.09.010.010.0
IE1111.011.09.010.011.0
IE9+HTA7.09.09.09.09.0
IE10+HTA7.010.09.010.010.0
IE11+HTA7.011.09.010.011.0

ドキュメントモードとHTAで利用可能な機能の関係

ドキュメントモードHTA:Application オプションVBScriptJavaScriptCanvasWebGL
7.0××
9.0××
10.0××
11.0××

以下、Canvas 機能を利用した描画サンプルです。

サンプル

<html>
<head>
<title>Hello, Canvas World!</title>
<!-- IE9/10 で Canvas を使用する場合 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- IE11 以上で Canvas を使用する場合 -->
<!-- <meta http-equiv="X-UA-Compatible" content="IE=10"> -->
<script type="text/vbscript">
Option Explicit
Const PI = 3.14159265358979
Const X_MAX = 640
Const Y_MAX = 480
Const R = 240
window.resizeTo X_MAX + 40, Y_MAX + 60

Sub Draw() 
    Dim canvas
    Set canvas = document.getElementById("Canvas")
    Dim ctx
    Set ctx = canvas.getContext("2d")
    Call DrawScreen( ctx )
    Call DrawGraph( ctx )
    Call DrawSin( ctx )
End Sub

Sub DrawScreen( ctx ) 
    ctx.fillStyle = "rgb( 0, 0, 0 )"
    ctx.fillRect 0, 0, X_MAX, Y_MAX
End Sub

Sub DrawGraph( ctx ) 
    ctx.strokeStyle = "rgb( 0, 127, 0 )"
    ctx.beginPath
    Dim x, y
    For x = 0 To X_MAX Step 20
        ctx.moveTo x, 0
        ctx.lineTo x, Y_MAX
    Next
    For y = 0 To Y_MAX Step 20
        ctx.moveTo 0, y
        ctx.lineTo X_MAX, y
    Next
    ctx.stroke
End Sub

Sub DrawSin( ctx ) 
    ctx.strokeStyle = "rgb( 0, 255, 0 )"
    ctx.beginPath
    ctx.moveTo 0, R
    Dim x, y
    For x = 0 To X_MAX Step 20
        y = R - R * Sin( 2 * PI * ( x / X_MAX ) )
        ctx.lineTo x, y
    Next
    ctx.stroke
End Sub
</script>
</head>
<body onload="Draw()">
<canvas id="Canvas" width="640" height="480"></canvas>
</body>
</html>

2010-01-31

VBScript 基礎文法最速マスター

11:50 | VBScript 基礎文法最速マスター - CX's VBScript Diary を含むブックマーク はてなブックマーク - VBScript 基礎文法最速マスター - CX's VBScript Diary

VBScript の文法一覧です。他の言語をある程度知っている人はこれを読めば VBScript の基礎をマスターして VBScript を書くことができるようになっています。簡易リファレンスとしても利用できると思いますので、これは足りないと思うものがあれば教えてください。

0. はじめに

 VBScriptVisual Basic のサブセットの為、すべてのステートメント、組み込み関数をサポートしているわけではありません。

 例えば、VBScript には型がなかったり(すべて Variant 型)、Format 関数がなかったりします。

 しかし、Windows 標準で使える(インストール無しで使用できる)スクリプト言語としては十分に強力なものとなっています。

 メモ帳さえあれば開発はできますので、試してみてはいかがでしょうか?

1. 基礎

変数宣言の強制

 ソースコードの先頭に「Option Explicit」を入れるようにしましょう。変数の宣言が強制されコードの品質も上がります。

Option Explicit
メッセージの表示
WScript.Echo "Hello, World." ' コンソールにメッセージを出力します
MsgBox "Hello, World."       ' メッセージボックスにメッセージを表示します
コメント

 コメントは「'」を用います。「Rem」も使用可能です。

' コメントその1
Rem コメントその2
変数の宣言

 変数の宣言は「Dim」を用います。固定サイズ配列の場合は「(10)」のようにサイズを指定します。サイズを指定しない場合は動的配列となります。

 VBScript の変数自体はバリアント型(Variant)で代入する値に応じて内部形式が変化します。

Dim num           ' 変数
Dim students(10)  ' 配列変数(配列は0~10となり要素数は11になります)
Dim students()    ' 動的配列
スクリプトの実行

 スクリプトを実行するにはコマンドラインで次のようにします。

CScript script.vbs

 出力結果をファイルに書き出すにはリダイレクトを使います。

CScript script.vbs > file.txt
デバッガの起動

 デバッガを起動するにはコマンドラインで次のようにします。

 ただし、事前に Visual Studio 等のデバッガがインストールされている必要があります。

CScript script.vbs //X

2. 数値

数値の表現

 変数には整数でも小数でも代入できます。代入する値に応じて、変数の内部形式が変化します。

num = 1          ' 整数型(Integer)
num = 1.234      ' 倍精度浮動小数点型(Double)
num = 1000000000 ' 長整数型(Long)
四則演算

 四則演算です。

num = 1 + 1    ' 2
num = 1 - 1    ' 0
num = 1 * 2    ' 2
num = 1 / 2    ' 0.5

 商と余りの求め方です。

num = 3 \ 2    ' 1(商)
num = 3 Mod 2  ' 1(余り)
インクリメントとデクリメント

 インクリメントとデクリメントです。

' インクリメント
i = i + 1

' デクリメント
i = i - 1

3. 文字列

文字列の表現

 文字列は「"」ダブルクォーテーションで囲みます。変数にタブや改行コードをセットするには「vbTab」や「vbCrLf」を用います。

str1 = "abc"
str2 = "a" & vbTab & "bc" & vbCrLf
文字列操作

 各種文字列操作です。

' 結合
str1 = "aaa" & "bbb"                            ' 文字列の連結
str2 = Join( Array("aaa", "bbb", "ccc"), "," )  ' 区切り文字に「,」(カンマ)を指定する場合

' 分割
record = Split("aaa,bbb,ccc", ",")

' 長さ
length = Len("abcdef")                ' 6
length = Len("あいうえお")            ' 5(文字数を数えるには Len 関数を使用します)
length = LenB("あいうえお")           ' 10(文字のバイト数を数えるには LenB 関数を使用します)

' 切り出し
str = Mid("abcd", 1, 2)               ' ab(1桁目から2文字)

' 検索
result = InStr("abcd", "cd")          ' 見つかった場合はその位置、見つからなった場合は 0 が返ります
result = InStr("あいうえお", "うえ")  ' 3(文字数で扱う場合は InStr 関数を使用します)
result = InStrB("あいうえお", "うえ") ' 5(バイト数で扱う場合は InStrB 関数を使用します)

4. 配列

配列変数の宣言と代入

 固定サイズ配列として宣言する場合

Dim ary(2)
ary(0) = 100
ary(1) = 200
ary(2) = 300

 動的配列として宣言する場合

Dim ary()
ReDim ary(2)
ary(0) = 100
ary(1) = 200
ary(2) = 300

 変数に Array 関数を使用して配列をセットする場合

Dim ary
ary = Array( 100, 200, 300 )
配列の要素の参照と代入
a = ary(0)   ' 100
b = ary(1)   ' 200
ary(0) = 1
ary(1) = 2
要素の個数
n = UBound(ary) - LBound(ary) + 1  ' 配列の上限 - 下限
配列の操作
Dim ary
ary = Array( 1, 2, 3 )

' 先頭を取り出す
a = ary(0)               ' a は 1
' 末尾を取り出す
b = ary(UBound(ary))     ' b は 3
' 末尾に追加
ReDim Preserve ary(UBound(ary) + 1)   ' 固定サイズ配列の場合は追加できません
ary(UBound(ary)) = 9     ' ary は [1,2,3,9] に

5. Dictionary オブジェクト

VBScript にはハッシュ変数はありませんが、Scripting.Dictionary オブジェクトを用いることで代替えが可能です。

Dictionary オブジェクトの宣言と代入
Dim hash
Set hash = CreateObject("Scripting.Dictionary")
hash.Add "a", 1
hash.Add "b", 2
Dictionary の要素の参照と代入
' 要素の参照
WScript.Echo hash("a") ' 1
WScript.Echo hash("b") ' 2

' 要素の代入
hash("a") = 5
hash("b") = 7
Dictionary のプロパティとメソッド
' キーの取得
keys = hash.Keys

' 値の取得
values = hash.Items

' キーの存在確認
hash.Exists("a")

' キーの削除
hash.Remove "a"

6. 制御文

If 文

 If 文です。1行に書く形式とブロック形式の構文が利用できます。

If 条件 Then 式 [Else 式]

 ブロック形式の If 文には End If が必要です。

If 条件 Then
    式
[Else]
    式
End If
If ~ ElseIf 文

 If ~ ElseIf 文です。「Else If」ではなく「ElseIf」である(Else と If の間に空白は入らない)ことに注意しましょう。

If 条件 Then
    式
[ElseIf 条件 Then]
    式
[Else]
    式
End If
Do ~ Loop 文

 Do ~ Loop 文です。Do While ~(真の間ループ)や Do Until ~(真になるまでループ)が利用できます。

i = 0
Do While i < 5
    
    ' 処理
    
    i = i + 1
Loop
For 文

 For文です。

For i = 0 To 4
    
Next
For Each 文

 For Each 文です。配列やコレクションオブジェクトの各要素を参照するときに使用します。

For Each field In fields
    
Next
比較演算子

 比較演算子の一覧です。「==」でなく「=」であることに注意してください。

num1 = num2  ' num1 は num2 と等しい
num1 <> num2 ' num1 は num2 と等しくない
num1 < num2  ' num1 は num2 より小さい
num1 > num2  ' num1 は num2 より大きい
num1 <= num2 ' num1 は num2 以下
num1 >= num2 ' num1 は num2 以上

7. サブルーチン

Sub プロシージャ

戻り値を返さない処理は Sub プロシージャで定義します。

Sub Show_Sum( num1, num2 )
    Dim total
    total = num1 + num2
    WScript.Echo total
End Sub
Function プロシージャ

 戻り値を返す処理は Function プロシージャで定義します。

Function Sum( num1, num2 )
    Dim total
    total = num1 + num2
    Sum = total ' 戻り値を指定
End Function

8. ファイル入出力

 VBScript でファイルの入出力を行うには Scripting.FileSystemObject オブジェクトを使用します。

Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("C:\temp\hoge.txt", ForReading)
Do Until file.AtEndOfStream
    strLine = file.ReadLine ' ファイルの1行分を読み込みます
Loop

file.Close

9. 知っておいたほうがよい文法

VBScript でよく出てくる知っておいたほうがよい文法の一覧です。

オブジェクトの代入と破棄

 オブジェクト変数に代入する場合は Set 文を使用します。

Set fso = CreateObject("Scripting.FileSystemObject")

 オブジェクト変数を破棄する場合は Set 文で Nothing をセットします。

Set fso = Nothing
Null と Empty と Nothing の違い

 Null … 変数に有効な値が変数に格納されていないことを示します。DB の Null 値に相当します。

 Empty … 変数が初期化されていない状態を表す値です。変数を宣言した直後はこの値です。

 Nothing … オブジェクト変数がオブジェクトを参照していない状態を表す値です。

VBScript の真偽値

 VBScript で偽と判断される値は、「False」「0」「Null」「Empty」「"False"」「"0"」です。これ以外は真になります。

ByVal と ByRef

 VBScript の引数には、値渡し(ByVal)と参照渡し(ByRef)があります。省略した場合は参照渡しになります。

Dim num1, num2, num3
num1 = 0
num2 = 0
num3 = 0

RefTest num1, num2, num3

WScript.Echo num1  ' 1
WScript.Echo num2  ' 0
WScript.Echo num3  ' 3

Sub RefTest( num1, ByVal num2, ByRef num3 )
    num1 = 1 ' 参照渡しの為、値は更新されます
    num2 = 2 ' 値渡しの為、値は更新されません
    num3 = 3 ' 参照渡しの為、値は更新されます
End Sub
While ~ Wend 文

 While ~ Wend 文です。Do ~ Loop 文の方が柔軟性がありますが、覚えておいて損はありません。

i = 0
While i < 5
    
    ' 処理
    
    i = i + 1
Wend
コマンドライン引数

 WScript.Arguments でコマンドラインの情報を取得できます。

 また、Arguments オブジェクトの Named プロパティを使用することで名前付き引数が利用可能です。

For i = 0 To WScript.Arguments.Count - 1
    WScript.Echo WScript.Arguments(i)
Next
エラー処理

 VBScript では、実行時にエラーがあると処理が停止します。

 処理を停止させず続行させる場合には On Error Resume Next を用います。エラー内容は Err オブジェクトで判断します。

On Error Resume Next
num = 1 / 0 ' 0 除算
If Err.Number <> 0 Then
    WScript.Echo "Err.Source      = [" & Err.Source & "]"       ' Microsoft VBScript 実行時エラー
    WScript.Echo "Err.Description = [" & Err.Description & "]"  ' 0 で除算しました。
    WScript.Echo "Err.Number      = [" & Err.Number & "]"       ' 11
End If
外部スクリプトのインクルード

 ExecuteGlobal ステートメントを使用することにより外部スクリプトをロードすることが可能です。

Option Explicit

Call Main()

Sub Main()
    Include "inc.vbs"    ' 外部スクリプトをロード
    
    WScript.Echo Sum( 1, 2 )
End Sub

Function Include( strFileName )
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim file
    Set file = fso.OpenTextFile( strFileName )
    ExecuteGlobal file.ReadAll
    file.Close
End Function
' File : inc.vbs
Function Sum( num1, num2 )
    Sum = num1 + num2
End Function

インタラクティブVBScript

 WSH は残念ながら対話型シェルの機能はありませんが、以下の 10 行ほどのプログラムを用いることで VBScript を対話的に実行することができるようになります。

' File : ivb.vbs
' Usage : CScript ivb.vbs
Do While True
    WScript.StdOut.Write(">>> ")
    ln = Wscript.StdIn.ReadLine
    If LCase(Trim(ln)) = "exit" Then Exit Do
    On Error Resume Next
    Err.Clear
    Execute ln
    If Err.Number <> 0 Then WScript.Echo(Err.Description)
    On Error Goto 0
Loop

 コマンドラインより「CScript ivb.vbs」と入力することで実行できます。終了は「exit」です。

C:\Users\cx20\edu\VBScript\ivb>CScript ivb.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

>>> WScript.Echo "Hello"
Hello
>>> WScript.Echo 1+1
2
>>> exit

参考情報

その他の基礎文法マスター

この記事は他の基本文法マスターに便乗して書いた物です。誤り等ございましたらコメント等して頂けると助かります。

忘我洞忘我洞2012/01/01 18:01VBScriptを昨年から使い始めましたので参考にさせていただきます。
変数宣言の強制が判らなかったので助かりました。
「素因数分解」と「2次方程式を解く」を作ってみたので、次は「2次不等式を解く」スクリプトを予定しています。