←
▼
▲
Sub Stream::SetEOS()
ストリームの中の現在位置以後のデータを削除します。
で現在位置を戻したときに使います。
←
▼
▲
Property Stream::Position as integer
現在位置。 リードまたはライトするバイト位置。
先頭は 0 です。
ファイルの末尾(Position=Size-1)の次(Position=Size)より後に
Position を設定しようとするとエラーになります。
Mode = adModeReadWrite でもエラーになります。
←
▼
▲
Property Stream::Size as integer
ストリーム・バッファーのサイズ(バイト)
←
▼
▲
Sub Stream::CopyTo( DstStream as Stream , Size as integer )
ストリームの一部を、別のストリームへコピーします。
←
▼
▲
WSH から使えるネットワークに関するライブラリです。
←
▼
▲
Function Network::EnumNetworkDrives() as IWshCollection
ネットワーク・ドライブと、そのリンク先を一覧します。
【引数】
返り値
ネットワーク・ドライブと、そのリンク先の一覧
Dim i
Dim net : Set net = WScript.CreateObject("WScript.Network")
Dim drives : Set drives = net.EnumNetworkDrives()
For i = 0 to drives.Count - 1 Step 2
echo drives(i) +" = "+ drives(i+1)
Next
サンプル
出力例:
H: = \\pc01\home
N: = \\pc01\export
←
▼
▲
Set g_sh = WScript.CreateObject("WScript.Shell")
WScript.Echo g_sh.RegRead( "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\"+_
"Explorer\Shell Folders\My Pictures" )
g_sh.RegWrite "HKEY_CURRENT_USER\Software\_Test\Sample", "Value1", "REG_SZ"
WScript.Echo g_sh.RegRead( "HKEY_CURRENT_USER\Software\_Test\Sample" )
g_sh.RegDelete "HKEY_CURRENT_USER\Software\_Test\Sample"
g_sh.RegDelete "HKEY_CURRENT_USER\Software\_Test\" '// キーを削除するときは末尾に \
レジストリのパスが間違っていると、80070002 エラーになります。
レジストリに読み書きできます。
WScript.Shell クラス
StdRegProv クラス
アクセス権が無かったときは、下記のエラーになります。
[ERROR](0x80070005) レジストリ キー "HKEY_CLASSES_ROOT\.lbk\" のルートが無効です
[ERROR](70) 書き込みできません
vbslib
RegWrite
関連
←
▼
▲
Windows NT 4.0 Service Pack 4 以降
Distributed Management Task Force (DMTF) が監視する業界標準に基づいている。
スクリプトを使って OS の管理機能にアクセスする。(WIN32 API を使わない)
物理メモリサイズ、プロセス管理、サービス、共有、ネットワーク管理など
参考
レジストリを操作するクラスです。
←
▼
▲
レジストリを操作するクラスです。
.EnumKey
.EnumValues
(他にもあります)
Sub RegEnumKey( Path, out_Keys )
Dim reg, i, root_key
i = InStr( Path, "\" )
Select Case Left( Path, i - 1 )
Case "HKEY_CLASSES_ROOT" : root_key = &h80000000
Case "HKEY_CURRENT_USER" : root_key = &h80000001
Case "HKEY_LOCAL_MACHINE" : root_key = &h80000002
Case "HKEY_USERS" : root_key = &h80000003
Case "HKEY_PERFORMANCE_DATA":root_key= &h80000004
Case "HKEY_CURRENT_CONFIG": root_key = &h80000005
Case "HKEY_DYN_DATA" : root_key = &h80000006
Case Else : Err.Raise &h80070002
End Select
Path = Mid( Path, i + 1 )
Set reg = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:StdRegProv")
reg.enumkey root_key, Path, out_Keys
End Sub
サンプル
レジストリの Path のキーのサブキーの名前を out_Keys 配列に列挙します。
サブキーが無いときは out_Keys = Null になります。
←
▼
▲
サンプル
Assert get_WMI( Empty, "Win32_TimeZone" ).Bias = 540 '// TZD = +09:00 = 9*60 = 540
TZD = タイムゾーン, TimeZoneDesignator
←
▼
▲
←
▼
▲
セクションの進捗具合をログに出力すると良いでしょう。
←
▼
▲
自動化すると、途中で失敗したときに、また最初から行わなければならないことがあります。
それを避けるため、復元ポイントに到達したことを記録していきます。
処理を続きから実行するかどうかについては、
<CurrentXxx>
<Specification name="(changing)" from="Base" to="New">
<EnvVars current="New" from="Old" to="New"/>
<Regs current="Old" from="Old" to="New"/>
</Specification>
</CurrentXxx>
関連
→ SAU問題 (Set After Use)
<CurrentXxx>
<Specification name="Base">
<EnvVars current="New"/>
<Regs current="New"/>
</Specification>
</CurrentXxx>
定常状態のステータス・ファイル
コミット・ファイル と 代理更新ファイル
Makefile や
活性化状態のステータス・ファイル
MakeRule クラス(vbslib)
を使うと、複雑な依存関係も対処できるでしょう。
を活用して
←
▼
▲
ロールバックとは、時間のかかる処理の途中にある復元ポイントから次の復元ポイントまで実行
する途中でエラーが発生したときに、前の復元ポイントの状態にデータやファイルを戻すことです。
次の復元ポイントまで行う処理を、一時フォルダの中で実行すれば、その一時フォルダを削除する
だけで、復元ポイントまで戻ることができます。
次の復元ポイントまで行う処理によって変更されるファイルの範囲に対して、バックアップを取れば、
リストアするだけで、復元ポイントまで戻ることができます。
復元ポイント1
復元ポイント2
一時フォルダ
バックアップ
エラーが発生したところでプログラムは異常終了させます。 次に起動したときに、一時フォルダや
バックアップの存在などから、復元ポイントの途中であることを検出して、ロールバックしてから、
再度復元ポイントから処理を開始させます。
→ コミット・ファイル と 代理更新ファイル
関連
ロールバック処理は、通常の処理の前に常に行ってください。
場合によっては、通常のロールバック処理より大きな単位のロールバック処理が必要になること
があります(たとえば、リビルド)。 大きな単位のロールバック処理を実現する手段は、MakeFile
で指定したターゲットファイルの一部、またはすべてを削除することなどがあります。
←
▼
▲
GUI でも CUI でも、ユーザーが入力したデータをすべて1つの構造体にまとめます。
階層化やインターフェイスを使って、領域を分割します。
メンバ変数名の先頭に m_ を付けるなどのルールがあれば、検索しやすくなります。
まとめると、現在の設定値を再利用して、差分の入力を自由にカスタマイズできます。
ユーザー入力を自動化すると、差分入力の仕様の変更に弱くなるので、自動化するときは、
構造体にパラメータを指定します。
←
▼
▲
環境変数はグローバルなので扱いにくい場合もあります。
そこで環境変数を VBS のクラスのメンバ変数に入れて、各種自動処理を行います。
←
▼
▲
←
▼
▲
Sub main2( Opt, AppKey )
Dim t0, t1, arr
ReDim arr( 10000000 )
t0 = Timer
CallWithArray arr
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.000(sec)
t0 = Timer
CallWithByValArray arr
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.753(sec)
t0 = Timer
LetArray arr
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.783(sec)
End Sub
Sub CallWithArray( arr )
End Sub
Sub CallWithByValArray( ByVal arr )
End Sub
Sub LetArray( arr )
Dim b : b = arr
End Sub
配列を渡すとき、ByVal を付けるとコピーが発生して遅くなります。
ByVal が無ければ、一瞬で渡ります。
関連
←
▼
▲
ReDim Preserve arr( UBound( arr ) + 1 )
arr( UBound( arr ) ) = 1234
上記のように、1要素ずつ増やすと、処理速度はかなり遅くなります。
Sub T_AddToFastUBound_Speed( Opt, AppKey )
Dim t0, t1, arr, arrc, i, arr_fast_ubound, plus
Const n = 100000
'//=== pre ReDim
ReDim arr(-1)
t0 = Timer
ReDim Preserve arr( n )
For i=0 To n
arr( i ) = i
Next
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.031(sec)
Assert UBound( arr ) = n
For i=0 To n : Assert arr( i ) = i : Next
'//=== ReDim each add
ReDim arr(-1)
t0 = Timer
For i=0 To n
ReDim Preserve arr( UBound( arr ) + 1 )
arr( UBound( arr ) ) = i
Next
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.688(sec)
Assert UBound( arr ) = n
For i=0 To n : Assert arr( i ) = i : Next
'//=== arr_fast_ubound : +1
ReDim arr(-1)
arr_fast_ubound = UBound( arr )
t0 = Timer
For i=0 To n
If UBound(arr) <= arr_fast_ubound Then _
ReDim Preserve arr( ( arr_fast_ubound + 100 ) * 4 )
arr_fast_ubound = arr_fast_ubound + 1
arr( arr_fast_ubound ) = i
Next
ReDim Preserve arr( arr_fast_ubound )
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.125(sec)
Assert UBound( arr ) = n
For i=0 To n : Assert arr( i ) = i : Next
'//=== arr_fast_ubound : +plus
ReDim arr(-1)
arr_fast_ubound = UBound( arr )
plus = +1
t0 = Timer
For i=0 To n
If UBound(arr) < arr_fast_ubound + plus Then _
ReDim Preserve arr( ( arr_fast_ubound + plus + 100 ) * 4 )
arr_fast_ubound = arr_fast_ubound + plus
arr( arr_fast_ubound ) = i
Next
ReDim Preserve arr( arr_fast_ubound )
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.172(sec)
Assert UBound( arr ) = n
For i=0 To n : Assert arr( i ) = i : Next
'//=== arr_fast_ubound : Big and reduce (*2)
ReDim arr(-1)
t0 = Timer
ReDim Preserve arr( 100000*2 )
For i=0 To n
arr( i ) = i
Next
ReDim Preserve arr( n )
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.031(sec)
Assert UBound( arr ) = n
For i=0 To n : Assert arr( i ) = i : Next
'//=== arr_fast_ubound : Big and reduce (*15)
ReDim arr(-1)
t0 = Timer
ReDim Preserve arr( 100000*15 )
For i=0 To n
arr( i ) = i
Next
ReDim Preserve arr( n )
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.125(sec)
Assert UBound( arr ) = n
For i=0 To n : Assert arr( i ) = i : Next
'//=== ArrayClassFastUBound
Set arrc = new ArrayClassFastUBound
arrc.StartFastUBound
t0 = Timer
For i=0 To n
arrc.AddToFastUBound i
Next
arrc.EndFastUBound
t1 = Timer - t0
WScript.Echo FormatNumber( t1, 3 ) & "(sec)" '// 0.766(sec)
Assert UBound( arrc.Items ) = n
For i=0 To n : Assert arrc.Items( i ) = i : Next
End Sub
→ T_Arr.vbs # [T_AddToFastUBound_Speed]
←
▼
▲
や
の Path プロパティや Name プロパティは、
処理速度が遅いです。
←
▼
▲
printf デバッグ
←
▼
▲
cscript //x script.vbs
デバッグを中止するときは、スクリプトを実行しているコマンドプロンプトを
終了します。(cscript 使用時のみ可能) wscript のプロセスを終了させるには、
タスクマネージャーを使うか、コマンドプロンプトから次のように入力します。
taskkill /IM "wscript.exe" /F
途中で止めたいときは、ブレークポイントを張るか、Stop 命令をスクリプト中に記述
します。
起動コマンド:
WSH のデバッガーをインストールしてから、次のように //x を付けて起動すると、
デバッガが起動し、スクリプトの先頭で止まります。
バッチファイルやショートカットにするとよいでしょう。
デバッガーの画面:
WSH のデバッガー
関連
←
▼
▲
インストールすると、自動的に使えるようになります。
確認済み: 2005, 2008, 2010 の Standard, Professional 以上。
Express Edition は、WSH をデバッグできません。 (VC++, VB, VC#, WebDev)
[ デバッグ > ウィンドウ > イミディエイト ] を選ぶと、? に続けて式を入力すると、実行して
結果を表示できます。
エラーが発生したりブレークしたら、[ デバッグ > ウィンドウ > 呼び出し履歴 ] から、関数の
呼び出し関係を確認できます。
エラーが発生したりブレークしたら、変数を右クリック、または、式を選択して右クリック
[ ウォッチ式の追加 ] を選ぶと、値を確認できます。
JIT のリストから 「新しいインスタンス Visual Studio xxxx」 を表示させないようにするには、
Visual Studio [ ツール > オプション > デバッグ > Just-In-Time ] の [ スクリプト ] のチェックを
はずします。
参考
Visual Studio のソリューション・エクスプローラーのソリューションを右クリック [ 名前の
変更 ] で名前の先頭に a をつけると、Just In Time Debugger のリストの先頭に表示され
ます。 もし、「ソリューション名を変更できません」 エラーが出るときは、
C:\WINDOWS\system32\*.suo を削除してください。
デバッガーを選択するときのリストの先頭にデバッガーを移動する
←
▼
▲
フルインストールすると、自動的に、Microsoft Script Editor がインストールされます。
メニューの [ ツール(T) > マクロ(M) > Microsoft Script Editor(E) ] でもインストールが始まります。
JIT のリストから 「新しいインスタンス Microsoft Script Editor」 を表示させないようにするには、
Excel [ ツール > マクロ > Microsoft Script Editor > ツール > オプション > デバッグ > JIT の設定
> JIT デバッグを有効にする ] のチェックをはずします。
MS Office 2007, 2010 には、WSH のデバッガーは入っていません。
←
▼
▲
[ スタート > すぺてのプログラム > アクセサリ > コマンド プロンプト ] から、下記のように
入力します。
"C:\Program Files\Microsoft Script Debugger\msscrdbg.exe" /regserver
"C:\Program Files\Microsoft Script Debugger\msscrdbg.exe" /unregserver
?Err.Description
型が一致しません。
アンインストールするには、コマンド プロンプトに下記コマンドを入力してから、
エラーが発生したら、[ 表示 > コマンドウィンドウ ] から、次のように入力すると、エラーメッセージを
確認できます。
Windows XP の場合:
Windows 7 / 8(RP) の場合:
上記から、scd10jp.exe をダウンロードする。
Windows 8(RP) では、安全ではないと表示されますが、問題ありません。
ダウンロード・フォルダーなどにできたものを使ってください。
1.
2.
scd10jp.exe を右クリック [ 管理者として実行 ]。 インストール先は、デフォルトのまま。
再起動はしなくても構いません。
3.
スタート [ プログラムとファイルの検索 ] に [ regedit ] と入力して
(Windows 8(RP) では、スタート画面を表示させて、キーボードから [ regedit ] と入力して)
[ Enter ] キーを押し、
[HKEY_CLASSES_ROOT\CLSID\{834128A2-51F4-11D0-8F20-00805F2CD064}\LocalServer32]
の (既定) に、C:\Program Files\Microsoft Script Debugger\msscrdbg.exe を入力する。
scd10jp.exe をダブルクリック。 インストール先は、デフォルトのまま。
再起動はしなくても構いません。
2.
1.
上記から、scd10jp.exe をダウンロードする。
3.
GetEchoStr 関数 (要vbslib) を使うと、オブジェクトの型や、配列の要素を確認できます。
?GetEchoStr( object )
? に続けて変数名や、ピリオドに続けてプロパティ名を入力すると、値を確認できます。
?a
2
?object.prop
2
エラーが発生したりブレークしたら、[ 表示 > 呼び出し履歴 ] から、関数の呼び出し関係を確認でき
ます。
コントロールパネルから、Microsoft Script Debugger をアンインストールする。
スクリプトの中の、途中で止めたい場所に、Stop 命令を記述して、
[ スタート > すぺてのプログラム > アクセサリ > コマンド プロンプト ] から、
デバッグを中止するときは、スクリプトを実行しているコマンドプロンプトを終了します。(cscript 使用
時のみ可能) wscript のプロセスを終了させるには、タスクマネージャーを使うか、コマンド
プロンプトから次のように入力します。 taskkill /IM "wscript.exe" /F
のように入力すると、デバッガーに接続します。 実行を開始すると、Stop 命令で止まります。
cscript //x script.vbs
デバッガーの使い方:
アンインストールするには、regedit を起動して、
[HKEY_CLASSES_ROOT\CLSID\{834128A2-51F4-11D0-8F20-00805F2CD064}\LocalServer32]
の(既定) に、C:\Windows\system32\mdm.exe を入力してから、
コントロールパネルから、Microsoft Script Debugger をアンインストールする。