CX's VBScript Diary

|

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次不等式を解く」スクリプトを予定しています。

2010-01-28

Visual Studio は VBScript 用の最強エディタ?

00:42 | Visual Studio は VBScript 用の最強エディタ? - CX's VBScript Diary を含むブックマーク はてなブックマーク - Visual Studio は VBScript 用の最強エディタ? - CX's VBScript Diary

Visual Studio(VS2005, VS2008)を用いることで、インテリセンスによるコード補完が可能になります。

Windows Script Wiki - エディタ/VWD2005

http://winscript.s41.xrea.com/wiki/index.php?%5B%5B%A5%A8%A5%C7%A5%A3%A5%BF%2FVWD2005%5D%5D

また、Visual Studio の [ツール] - [外部ツール] で「CScript.exe //X」を登録することで *.vbs ファイルをデバッグ実行することが可能です。

タイトルVBSスクリプトのデバッグ実行(&D)
コマンドC:\WINDOWS\system32\cscript.exe
引数//X $(ItemPath)

Visual Studio の Express Edition は無償ですので利用してみてはいかがでしょうか?

(ただし、VS2008 では、SP1 を適用しないと、インテリセンスやコードの色分けが行われないようです。)

Microsoft Visual Studio 2008 Express Edition

http://www.microsoft.com/japan/msdn/vstudio/Express/

ほんだらほんだら2010/01/31 13:55なんか、これできるんなら、VB6のエンジン(に近い物)が載ってるわけで…
まだVBSもVBAも現役なわけだし、
VB6も継続サポートしたらいいのにねぇ。

cx20cx202010/02/01 00:25> VB6も継続サポートしたらいいのにねぇ。
本当にそう思います。
32bit OS が現役のうちは、まだまだ COM を使った開発が現役なのでは?と思います。
64bit 版のクライアントが普及するころ(何年後か分かりませんが)には、.NET 化が進んでいそうな気もしますけど。

2010-01-26

10 行で作る VBScript インタラクティブシェル

21:17 | 10 行で作る VBScript インタラクティブシェル - CX's VBScript Diary を含むブックマーク はてなブックマーク - 10 行で作る VBScript インタラクティブシェル - CX's VBScript Diary

次世代 Windows シェルと言われている PowerShell は対話型シェルの機能を持っていますが、昔ながらの VBScript では実現できないのでしょうか?と、思っていたら、以下のようなサンプルを見つけました。

VBScript interactive shell

http://www.kryogenix.org/days/2004/04/01/interactiveVbscript

サンプルコード

' File : console.vbs
' Usage : CScript //Nologo console.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 console.vbs [Enter]
実行結果

上記のコマンドを実行すると以下のように 対話的に VBScript のコマンドを実行することが可能になります。終了は「exit」です。

>>> strMessage = "Hello" [Enter]
>>> CreateObject("SAPI.SpVoice").Speak strMessage [Enter]
>>> exit [Enter]

基本的に Execute() しているだけですが、対話型シェルっぽく動作してくれます。

ただし、関数を作成しようとすると、エラーになってしまうようです。

>>> Function Hoge()
'End' がありません。

その場合は、関数を1行に収めることで実行が可能なようです。

>>> Function Hoge() : WScript.Echo "Hello" : End Function
>>> Call Hoge()
Hello

参考情報

2009-08-13VBScript で PE ヘッダを読み込む方法

VBScript で PE ヘッダを読み込む方法

17:29 | VBScript で PE ヘッダを読み込む方法 - CX's VBScript Diary を含むブックマーク はてなブックマーク - VBScript で PE ヘッダを読み込む方法 - CX's VBScript Diary

VBScript から EXE/OCX/DLL 作成時のコンパイラのバージョンが取得できないか?と思い、調査してみました。

コンパイラのバージョンは PE ヘッダのリンカバージョンが参考になりそうです。

また、VBScript から、モジュールの PE ヘッダを読み込むには、ADO Stream オブジェクトを使用すれば可能そうです。

 ADDRESS   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF 
------------------------------------------------------------------------------
 00000000  4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00   MZ.............. 
 00000010  B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00   ク.......@....... 
 00000020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................ 
 00000030  00 00 00 00 00 00 00 00 00 00 00 00 E0 00 00 00   ................ 
                                               ^^^^^^^^^^^ <-- PE ヘッダ相対位置
 00000040  0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68   ..コ..エ.ヘ!ク.Lヘ!Th 
 00000050  69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F   is program canno 
 00000060  74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20   t be run in DOS  
 00000070  6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00   mode....$....... 
     :                           :                                   :
 000000E0  50 45 00 00 4C 01 03 00 87 52 02 48 00 00 00 00   PE..L...⑲.H.... 
           ^^^^^^^^^^^ PE ヘッダシグネチャ
 000000F0  00 00 00 00 E0 00 0F 01 0B 01 07 0A 00 78 00 00   .............x.. 
                                         ^^^^^ リンカバージョン
 00000100  00 8C 00 00 00 00 00 00 9D 73 00 00 00 10 00 00   ........捏...... 

と、いうことで、以下のやり方で情報を取得してみることにしました。

  1. ADO Stream にてファイル読み込み
  2. IMAGE_DOS_HEADER の e_lfanew(PE ヘッダの開始位置)を取得
  3. PE ヘッダの開始位置に移動し IMAGE_OPTIONAL_HEADER の MajorLinkerVersion を取得
  4. PE ヘッダの開始位置に移動し IMAGE_OPTIONAL_HEADER の MinorLinkerVersion を取得

サンプルコード

' File : ShowLinkerVer.vbs
' Usage : CScript ShowLinkerVer.vbs //Nologo /F:FileName[.exe|.dll|.ocx]
' Description : モジュール作成時のリンカバージョンを表示

Option Explicit

Call Main()

Sub Main()
    Dim param
    Set param = New CmdParamParser
    If param.Initialize( WScript.Arguments ) = False Then
        param.ShowUsage
        WScript.Quit
    End If

    Dim pe
    Set pe = New PEReader
    pe.Load param.FileName
    pe.Show
End Sub

Class CmdParamParser
    Private m_strFileName
    
    Public Property Get FileName
        FileName = m_strFileName
    End Property

    Public Function Initialize( objArgs )
        If objArgs.Count = 0 Then
            Initialize = False
            Exit Function
        End If
        
        m_strFileName = objArgs.Named.Item( "F" ) ' WSH 5.6 以上でのみサポート
        If Len(m_strFileName) = 0 Then
            Initialize = False
            Exit Function
        End If
    
        Initialize = True
    End Function

    Public Sub ShowUsage()
        WScript.Echo "Usage : CScript ShowLinkerVer.vbs //Nologo /F:FileName[.exe|.dll|.ocx]" & vbCrLf
    End Sub
End Class

Class PEReader
    Private m_stm
    Private m_strFileName
    Private m_szBuf
    Private m_nHeaderSize
    Private m_nMajorLinkerVer
    Private m_nMinorLinkerVer
    
    Public Property Get PEHeaderSize
        PEHeaderSize = m_nHeaderSize
    End Property
    
    Public Property Get MajorLinkerVer
        MajorLinkerVer = m_nMajorLinkerVer
    End Property
    
    Public Property Get MinorLinkerVer
        MinorLinkerVer = m_nMinorLinkerVer
    End Property
    
    Public Property Get LinkerVer
        LinkerVer = CStr(MajorLinkerVer) & "." & CStr(MinorLinkerVer)
    End Property

    Public Property Get FileName
        FileName = m_strFileName
    End Property
    
    Private Sub Class_Initialize
        Set m_stm = CreateObject("ADODB.Stream")
        m_stm.Type = 1 ' adTypeBinary
        m_stm.Open
    End Sub
    
    Private Sub Class_Terminate
        Set m_stm = Nothing
    End Sub
    
    Public Function Load( strFileName )
        On Error Resume Next
        m_strFileName = ExpandEnv( strFileName )
        m_stm.LoadFromFile m_strFileName
        If Err.Number <> 0 Then
            Load = False
            Exit Function
        End If
        m_stm.Position = 1
        m_szBuf = m_stm.Read( 512 ) ' 多めに読み込み

        m_nHeaderSize     = GetPEHeaderSize( m_szBuf )
        m_nMajorLinkerVer = GetMajorLinkerVer( m_szBuf )
        m_nMinorLinkerVer = GetMinorLinkerVer( m_szBuf )
        Load = True
    End Function
    
    Public Function ExpandEnv( strFileName )
        Dim strResult
        Dim shell
        Set shell = CreateObject("WScript.Shell")
        strResult = shell.ExpandEnvironmentStrings( strFileName )
        Set shell = Nothing
        ExpandEnv = strResult
    End Function
    
    Public Sub Show()
        WScript.Echo "FileName        = [" & Me.FileName & "]"
        WScript.Echo "PEHeaderSize    = [" & Me.PEHeaderSize & "]"
        WScript.Echo "MajorLinkerVer  = [" & Me.MajorLinkerVer & "]"
        WScript.Echo "MinorLinkerVer  = [" & Me.MinorLinkerVer & "]"
        WScript.Echo "LinkerVer       = [" & Me.LinkerVer & "]"
    End Sub

    Private Function GetPEHeaderSize( szBuf )
        Dim nResult
        Dim nPosition
        Dim nSize

        nPosition = 60 ' IMAGE_DOS_HEADER の e_lfanew の位置
        nSize = 4
        nResult = GetFieldValueFromBinary( szBuf, nPosition, nSize )

        GetPEHeaderSize = nResult
    End Function

    Private Function GetMajorLinkerVer( szBuf )
        Dim nResult
        Dim nPosition
        Dim nSize

        nPosition = GetPEHeaderSize( szBuf )
        nPosition = nPosition + 4 + 20 + 2     ' IMAGE_OPTIONAL_HEADER の MajorLinkerVersion の位置
        nSize = 1
        nResult = GetFieldValueFromBinary( szBuf, nPosition, nSize )

        GetMajorLinkerVer = nResult
    End Function

    Private Function GetMinorLinkerVer( szBuf )
        Dim nResult
        Dim nPosition
        Dim nSize

        nPosition = GetPEHeaderSize( szBuf )
        nPosition = nPosition + 4 + 20 + 2 + 1 ' IMAGE_OPTIONAL_HEADER の MinorLinkerVersion の位置
        nSize = 1
        nResult = GetFieldValueFromBinary( szBuf, nPosition, nSize )

        GetMinorLinkerVer = nResult
    End Function

    Private Function GetFieldValueFromBinary( szBuf, nPosition, nSize )
        Dim nResult

        Dim szField
        szField = MidB( szBuf, nPosition, nSize )
        nResult = ConvertBinaryToNumber( szField, nSize )

        GetFieldValueFromBinary = nResult
    End Function

    Private Function ConvertBinaryToNumber( szBuf, nSize )
        Dim nResult
        nResult = 0
        Dim ch
        Dim i
        For i = 1 To nSize
            ch = AscB( MidB( szBuf, i, 1 ) )
            nResult = nResult + ch * 256 ^ (i-1) ' リトルエンディアンを想定
        Next
        ConvertBinaryToNumber = nResult
    End Function
End Class
コマンド例
CScript ShowLinkerVer.vbs //Nologo /F:"C:\WINDOWS\SYSTEM32\notepad.exe"
実行結果
FileName        = [C:\WINDOWS\SYSTEM32\notepad.exe]
PEHeaderSize    = [224]
MajorLinkerVer  = [7]
MinorLinkerVer  = [10]
LinkerVer       = [7.10]

<リンカバージョンに対応する主な開発環境>
 5.1  … VC++5.0 (Visual Studio 97)
 6.0  … VC++6.0 (Visual Studio 6.0)
 7.0  … VC++7.0 (Visual Studio .NET 2002)
 7.10 … VC++7.1 (Visual Studio .NET 2003)
 8.0  … VC++8.0 (Visual Studio 2005)
 9.0  … VC++9.0 (Visual Studio 2008)
10.0  … VC++10.0 (Visual Studio 2010)
----------------------------------------
 2.25 … Delphi or BCB?

<不明なリンカバージョン>
 3.1  … DBGRID32.OCX, COMCT232.OCX 等
 5.12 … MSDXM.OCX 等
 5.2  … MSFLXGRD.OCX, RICHTX32.OCX, COMDLG32.OCX 等

参考情報

2009-02-14Microsoft Anna で空耳英語

Microsoft Anna で空耳英語

01:15 | Microsoft Anna で空耳英語 - CX's VBScript Diary を含むブックマーク はてなブックマーク - Microsoft Anna で空耳英語 - CX's VBScript Diary

日本語版の Windows Vista には、残念ながら日本語音声合成エンジンが搭載されていません。

そこで、無理やり空耳英語(英語の発音で日本語をしゃべらせること)で、日本語(50音)をしゃべらせてみました。

サンプルコード

' File : SoramimiSpeaker.vbs
' Usage : CScript //Nologo SoramimiSpeaker.vbs
Option Explicit

Call Main()

Sub Main()
    Dim speaker
    ' オブジェクト生成
    Set speaker = New SoramimiSpeaker
    
    ' 日本語50音
    Call SpeakJapanese50( speaker )
    
    ' 日本語サンプル(英語を含む)
    Call SpeakJapaneseNormal( speaker )
    
    ' 早口言葉
    Call SpeakJapaneseHayakuchi( speaker )
    
    ' オブジェクト破棄
    Set speaker = Nothing
End Sub

Sub SpeakJapanese50( speaker )
    speaker.Speak "あいうえお"
    speaker.Speak "かきくけこ"
    speaker.Speak "さしすせそ"
    speaker.Speak "たちつてと"
    speaker.Speak "なにぬねの"
    speaker.Speak "はひふへほ"
    speaker.Speak "まみむめも"
    speaker.Speak "やゆよ"
    speaker.Speak "らりるれろ"
    speaker.Speak "わをん"
    
'    speaker.Speak "がぎぐげご"
'    speaker.Speak "ざじずぜぞ"
'    speaker.Speak "だぢづでど"
'    speaker.Speak "ぱぴぷぺぽ"
'    
'    speaker.Speak "きゃきゅきょ"
'    speaker.Speak "しゃしゅしょ"
'    speaker.Speak "ちゃちゅちょ"
'    speaker.Speak "にゃにゅにょ"
'    speaker.Speak "ひゃひゅひょ"
'    speaker.Speak "みゃみゅみょ"
'    speaker.Speak "りゃりゅりょ"
'    speaker.Speak "ぎゃぎゅぎょ"
'    speaker.Speak "じゃじゅじょ"
'    speaker.Speak "びゃびゅびょ"
'    speaker.Speak "ぴゃぴゅぴょ"
'    
'    speaker.Speak "あんいんうんえんおん"
'    speaker.Speak "かんきんくんけんこん"
'    speaker.Speak "さんしんすんせんそん"
'    speaker.Speak "たんちんつんてんとん"
'    speaker.Speak "なんにんぬんねんのん"
'    speaker.Speak "はんひんふんへんほん"
'    speaker.Speak "まんみんむんめんもん"
'    speaker.Speak "やんゆんよん"
'    speaker.Speak "らんりんるんれんろん"
'    speaker.Speak "わんをんんん"
'    speaker.Speak "がんぎんぐんげんごん"
'    speaker.Speak "ざんじんずんぜんぞん"
'    speaker.Speak "だんぢんづんでんどん"
'    speaker.Speak "ばんびんぶんべんぼん"
'    speaker.Speak "ぱんぴんぷんぺんぽん"

End Sub

Sub SpeakJapaneseNormal( speaker )
    ' 日本語サンプル(英語を含む)
    speaker.Speak "こんにちは、せかい。"
    speaker.Speak "Japanese は、むずかしいです。"
    speaker.Speak "にほんごばんの Windows Vista には、ざんねんながら、にほんごごうせいえんじんが、とうさい、されていません。"
End Sub

Sub SpeakJapaneseHayakuchi( speaker )
    ' 早口言葉
    speaker.Speak "ばすがすばくはつ"
    speaker.Speak "あかまきがみあおまきがみきまきがみ"
    speaker.Speak "となりのきゃくは、よくかきくうきゃくだ"
End Sub

' 空耳読み上げクラス
Class SoramimiSpeaker
    Private m_dic
    Private m_sapi
    ' 初期化処理
    Sub Class_Initialize
        Set m_dic  = CreateObject("Scripting.Dictionary")
        Set m_sapi = CreateObject("SAPI.SpVoice")

        ' 辞書追加
        AppendDic "あ = i;   い = e;   う = wu;  え = a;   お = wo"
        AppendDic "か = car; き = key; く = coo; け = k;   こ = coe"
        AppendDic "さ = sar; し = she; す = su;  せ = set; そ = so"
        AppendDic "た = ta;  ち = chie;つ = two; て = tait; と = toe"
        AppendDic "な = na;  に = neet;ぬ = noon;ね = nee; の = no"
        AppendDic "は = ha;  ひ = he;  ふ = foo; へ = hey; ほ = ho"
        AppendDic "ま = my;  み = me;  む = moo; め = may; も = moe"
        AppendDic "や = yae; ゆ = you; よ = yor"
        AppendDic "ら = rar; り = lee; る = lew; れ = ray; ろ = roe"
        AppendDic "わ = war; を = wo;  ん = n"
        AppendDic "が = gat; ぎ = geek;ぐ = goo; げ = gay; ご = go"
        AppendDic "ざ = zak; じ = ji;  ず = zoo; ぜ = zee; ぞ = zlo"
        AppendDic "だ = duh; ぢ = gee; づ = zu;  で = day; ど = doe"
        AppendDic "ば = bar; び = be;  ぶ = boo; べ = baer;ぼ = bo"
        AppendDic "ぱ = par; ぴ = pea; ぷ = poor;ぺ = pe;  ぽ = po"

        AppendDic "きゃ = cat; きゅ = q;   きょ = kyo"
        AppendDic "しゃ = sha; しゅ = shu; しょ = show"
        AppendDic "ちゃ = cha; ちゅ = chu; ちょ = cho"
        AppendDic "にゃ = nia; にゅ = new; にょ = gno"
        AppendDic "ひゃ = char;ひゅ = chew;ひょ = chow"
        AppendDic "みゃ = mya; みゅ = mew; みょ = mio"
        AppendDic "りゃ = lya; りゅ = lue; りょ = low"
        AppendDic "ぎゃ = gag; ぎゅ = gue; ぎょ = gheo"
        AppendDic "じゃ = jar; じゅ = ju;  じょ = jo"
        AppendDic "びゃ = vya; びゅ = view;びょ = byung"
        AppendDic "ぴゃ = pyat;ぴゅ = pure;ぴょ = pyong"

        AppendDic "あん = an,;  いん = in;   うん = unn;  えん = en;   おん = on"
        AppendDic "かん = can;  きん = kin;  くん = kung; けん = ken;  こん = kong"
        AppendDic "さん = sun;  しん = shin; すん = seung;せん = senn; そん = song"
        AppendDic "たん = tun;  ちん = ching;つん = zun;  てん = ten;  とん = tong"
        AppendDic "なん = nan;  にん = nin;  ぬん = noon; ねん = neng; のん = non"
        AppendDic "はん = han;  ひん = hin;  ふん = hunn; へん = hen;  ほん = hon"
        AppendDic "まん = man;  みん = ming; むん = moon; めん = men;  もん = mong"
        AppendDic "やん = yang; ゆん = yung; よん = yong"
        AppendDic "らん = run;  りん = rin;  るん = rune; れん = ren;  ろん = ron"
        AppendDic "わん = wan;  をん = won;  んん = n"
        AppendDic "がん = gun;  ぎん = ginn; ぐん = goun; げん = gain; ごん = gon"
        AppendDic "ざん = xan;  じん = jin;  ずん = zun;  ぜん = zeng; ぞん = zong"
        AppendDic "だん = dunn; ぢん = zin;  づん = zun;  でん = den;  どん = don"
        AppendDic "ばん = ban;  びん = bin;  ぶん = boon; べん = ben;  ぼん = bon"
        AppendDic "ぱん = paan; ぴん = pin;  ぷん = poon; ぺん = pen;  ぽん = pong"

        AppendDic "は、= war,; は。= war."
        AppendDic "へ、= e,;   へ。= e."
        AppendDic "っ = ,; 、= ,;  。= .; ー = -; ? = ?; ! = !"
    End Sub
    ' 終了処理
    Sub Class_Terminate
        Set m_sapi = Nothing
        Set m_dic = Nothing
    End Sub
    ' 辞書追加
    Sub AppendDic( strDic )
        Dim strItems
        strItems = Split( strDic, ";" )
        Dim strItem
        For Each strItem In strItems
            Dim strKey
            Dim strValue
            Dim strKeyValueArray
            strKeyValueArray = Split( strItem, "=" )
            strKey   = Trim( strKeyValueArray(0) )
            strValue = Trim( strKeyValueArray(1) )
            m_dic.Add strKey, strValue
        Next
    End Sub
    ' 日本語読み上げ
    Sub Speak( strJapanese )
        Dim strEnglish
        ' あいうえお -> "i-e-wu-a-wo"
        strEnglish = ConvertJapaneseToEnglish( strJapanese )
        WScript.Echo "[" & strJapanese & "](Japanese) -> [" & strEnglish & "](English)"
        m_sapi.Speak strEnglish
    End Sub
    ' 空耳辞書変換
    Function ConvertJapaneseToEnglish( strJapanese )
        Dim strResult
        Dim strKey
        Dim strKey1
        Dim strKey2
        Dim strValue
        Dim bFirst
        bFirst = True
        Dim i
        For i = 1 To Len( strJapanese )
            If i = 1 Then
                bFirst = True
            Else
                bFirst = False
            End If
            strKey1 = Mid( strJapanese, i, 1 )
            strKey2 = Mid( strJapanese, i, 2 )
            If m_dic.Exists( strKey2 ) Then
                strKey = strKey2
                i = i + 1
            ElseIf m_dic.Exists( strKey1 ) Then
                strKey = strKey1
            Else
                strKey = strKey1
            End If
            
            If m_dic.Exists( strKey ) Then
                strValue = m_dic( strKey )
                If bFirst Or strValue = "," Or strValue = "." Then
                    strResult = strResult & strValue
                Else
                    strResult = strResult & " " & strValue
                End If
            Else
                strResult = strResult & strKey
            End If
        Next
        ConvertJapaneseToEnglish = strResult
    End Function
End Class

実行結果

[あいうえお](Japanese) -> [i e wu a wo](English)
[かきくけこ](Japanese) -> [car key coo k coe](English)
[さしすせそ](Japanese) -> [sar she su set so](English)
[たちつてと](Japanese) -> [ta chie two tait toe](English)
[なにぬねの](Japanese) -> [na neet noon nee no](English)
[はひふへほ](Japanese) -> [ha he foo hey ho](English)
[まみむめも](Japanese) -> [my me moo may moe](English)
[やゆよ](Japanese) -> [yae you yor](English)
[らりるれろ](Japanese) -> [rar lee lew ray roe](English)
[わをん](Japanese) -> [war won](English)
[こんにちは、せかい。](Japanese) -> [kong neet chie war, set car e.](English)
[Japanese は、むずかしいです。](Japanese) -> [Japanese  war, moo zoo car she e day su.](English)
[にほんごばんの Windows Vista には、ざんねんながら、
 にほんごごうせいえんじんが、とうさい、されていません。](Japanese) -> 
[neet hon go ban no Windows Vista  neet war, xan neng na gat rar, 
 neet hon go go wu set e en jin gat, toe wu sar e, sar ray tait e my senn.](English)
[ばすがすばくはつ](Japanese) -> [bar su gat su bar coo ha two](English)
[あかまきがみあおまきがみきまきがみ](Japanese) -> [i car my key gat me i wo my key gat me key my key gat me](English)
[となりのきゃくは、よくかきくうきゃくだ](Japanese) -> [toe na lee no cat coo war, yor coo car key coo wu cat coo duh](English)

空耳50音

iewuawo
carkeycookcoe
sarshesusetso
tachietwotaittoe
naneetnoonneeno
hahefooheyho
mymemoomaymoe
yae you yor
rarleelewrayroe
war wo
n
gatgeekgoogaygo
zakjizoozeezlo
duhgeezudaydoe
barbeboobaerbo
parpeapoorpepo
きゃcatきゅqきょkyo
しゃshaしゅshuしょshow
ちゃchaちゅchuちょcho
にゃniaにゅnewにょgno
ひゃcharひゅchewひょchow
みゃmyaみゅmewみょmio
りゃlyaりゅlueりょlow
ぎゃgagぎゅgueぎょgheo
じゃjarじゅjuじょjo
びゃvyaびゅviewびょbyung
ぴゃpyatぴゅpureぴょpyong
あんan,いんinうんunnえんenおんon
かんcanきんkinくんkungけんkenこんkong
さんsunしんshinすんseungせんsennそんsong
たんtunちんchingつんzunてんtenとんtong
なんnanにんninぬんnoonねんnengのんnon
はんhanひんhinふんhunnへんhenほんhon
まんmanみんmingむんmoonめんmenもんmong
やんyang ゆんyung よんyong
らんrunりんrinるんruneれんrenろんron
わんwan をんwon
んんn
がんgunぎんginnぐんgounげんgainごんgon
ざんxanじんjinずんzunぜんzengぞんzong
だんdunnぢんzinづんzunでんdenどんdon
ばんbanびんbinぶんboonべんbenぼんbon
ぱんpaanぴんpinぷんpoonぺんpenぽんpong

参考情報

|