palm84.com

革命的愛熊主義者同盟!

【私的】WSH / VBScript めも

2021.4.1 移転しました...
  • このページの旧URLは
    • http://www10.plala.or.jp/palm84/wsh.html
内容古いです

最終更新日は 2012.1.14、ご注意。

(Google ドライブ以外の) リンク先テキストファイル (.txt) はブラウザで開くと文字化けするのでご注意

INDEX

2012.1.14 FileVersion.vbs を修正
最終更新日 2012.1.14

とっても初歩的私的(何)・・・

cmd.exe では限界あるので、ちゃんと覚えないとだめですね...やっぱり?(何)

尚、陳腐なお約束でありますが、ここのスクリプトについては全くの初心者レベルなので at your own risk ということで。

入門編

WSHを始めよう - @IT

WSHの基本から。めちゃ丁寧な解説。

@IT:運用 Windows管理者のためのWindows Script Host入門

オブジェクトの詳細など。

Microsoft資料

WSH(wscript.exe)のバージョン
  • Windows XP SP3 - 5.7.0.18066
  • Windows XP SP2 - 5.6.0.8820
  • Windows 2000 SP4 - 5.6.0.6626

Windows Script 5.6 ドキュメント(chmヘルプファイル)がダウンロードできます。

MSDN ドキュメント

Windows Script Host
リファレンス
VBScript

Microsoft その他

基本

  1. 記述規則
  2. 変数
  3. オブジェクト
  4. メソッド
  5. 関数
  6. ステートメント
  • オブジェクトの作成
'オブジェクト変数の宣言とFileSystemObjectオブジェクトの作成。
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")

'メモ帳を起動。
objWshShell.Run "C:\Windows\System32\notepad.exe"

記述規則

  • リテラル文字列は引用符【 " 】で囲む、変数は囲まない
  • リテラル文字連結は【 &
  • リテラル文字列改行は 【 & vbCrLf &
  • コードの改行【 _
コード記述規則

規則ではないけど、区別するために。下記推奨

変数の名前付け規則
内部処理形式プリフィックス使用例
ブール型(Boolean)bln, bblnFound
バイト型bytbytRasterData
日付型dtm, dtdtmStart
倍精度浮動小数点数型dbl, ddblTolerance
エラー型errerrOrderNum
整数型int, iintQuantity
長整数型lng, llngDistance
オブジェクト型obj, oobjCurrent
単精度浮動小数点数型sngsngAverage
文字列型str, sstrFirstName

変数

配列

オブジェクト

WScript オブジェクト
WshShell オブジェクト
FileSystemObject
Windows Management Instrumentation (Windows)
サンプル

メソッド

関数

変換関数
  • 10進数を16進数に
    • 10進数の【10】を16進数に
    • Hex(10) - 値は A
  • 16進数を10進数に
    • 16進数の【10】を10進数に
    • CInt(&H10) - 値は 16
    • CLng(&H10) - 値は 16

ステートメント

Call ステートメント

Sub プロシージャおよび Function プロシージャの呼び出し

Class ステートメント

Class の定義

Sub ステートメント

Sub プロシージャの定義

Function ステートメント

Function プロシージャの定義

If...Then...Else ステートメント

条件分岐

If condition Then
   [statements]
[ElseIf condition-n Then
   [elseifstatements]] . . .
[Else
   [elsestatements]]
End If
  • If - Then - ElseIF - Then - End IF
If Err.Number = 11 Then
        '0除算エラー。
        MsgBox "0で割ることはできません。"
    ElseIf Err.Number = 13 Then
        '型不一致エラー。
        MsgBox "数値を入力してください。"
    ElseIf Err.Number = 0 Then
         'エラーが発生していない場合はループを抜ける。
        Exit Do
    Else
        'そのほかのエラーの場合。
        MsgBox "想定外のエラーです。"
    End If
    'エラー情報をクリアする。
    Err.Clear
    On Error Goto 0
Select Case ステートメント

条件分岐

Select Case testexpression
   [Case expressionlist-n
      [statements-n]] . . .
   [Case Else expressionlist-n
      [elsestatements-n]]
End Select
  • Select - Case - Else - End Select
Select Case Err.Number
        Case 11
            '0除算エラー。
            MsgBox "0で割ることはできません。"
        Case 13
            '型不一致エラー。
            MsgBox "数値を入力してください。"
        Case 0
            'エラーが発生していない場合はループを抜ける。
            Exit Do
        Case Else
            'そのほかのエラーの場合。
            MsgBox "想定外のエラーです。"
End Select
On Error ステートメント

実行時エラー発生時の続行処理

On Error Resume Next
On Error GoTo 0
On Error Resume Next
Err.Raise 6   ' オーバーフロー エラーを発生させます。
MsgBox ("エラー番号 " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' エラーのクリア。
For...Next ステートメント

指定した回数で繰り返し

For counter = start To end [Step step]
    [statements]
    [Exit For]
    [statements]
Next
For Each...Next ステートメント

配列やコレクションを指定して繰り返し

For Each element In group
   [statements]
   [Exit For]
   [statements]
Next [element]
Do...Loop ステートメント

条件が真である間(While)、条件が真になるまで (Until)、繰り返し

Do [{While | Until} condition]
   [statements]
   [Exit Do]
   [statements]
Loop 
While...Wend ステートメント

条件が真の間、繰り返し

While condition
   Version [statements]
Wend
With ステートメント (VBScript)

まとめて設定

With object
   statements
End With

Tips

いろいろ

テキストへ書き込み

  • ※標準出力(cscript.exe で実行)
Dim StdOut,StdIn
Set StdOut = WScript.StdOut
Set StdIn = WScript.StdIn
Dim strX
strX = StdIn.ReadLine()
StdOut.WriteBlankLines 1
strX = StrReverse(strX)
StdOut.WriteLine strX
cscript //NoLogo StdInStdOut.vbs >std.txt
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim objTxt
Set objTxt = objFSO.OpenTextFile("test1.txt", 8, true, -2)
Dim objWS
Set objWS = WScript.CreateObject("WScript.Shell")
' Image File Execution Options の不正キー
Dim strEXEname,I
strEXEname = Array("regedit.exe", "regedit.com", "taskmgr.exe", "notepad.exe")
Const strKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\"
For Each I In (strEXEname)
     On Error Resume Next
          objWS.RegRead strKey & I & "\"
          If Err.Number = -2147024894 Then
               WScript.Echo I, "キーはありません"
               objTxt.WriteLine I & "キーはありません"
          ElseIf Err.Number = 0 Then
               WScript.Echo I, "キーは存在します"
               objTxt.WriteLine I & "キーは存在します"
          End If
          Err.Clear
     On Error Goto 0
Next
objTxt.Close
objWS.Run "test1.txt"
Set objFSO = Nothing
Set objTxt = Nothing

レジストリ

指定パスでRegeditを起動

LastKey にパスを書き込んで regedit.exe を(再)起動

指定キーの既定エントリ・指定エントリの読み取り

WshShell オブジェクトの RegRead メソッドを利用する

指定キーのサブキー・値エントリの列挙

WMI(Windows Management Instrumentation)サービスの StdRegProv Class を利用する

小ネタ

文字列を文字コード(符号)へ
カンマ(,)区切りの文字コード(符号)を文字列へ
レジストリ【REG_EXPAND_SZ】値を文字列に変換
HTMLの文字参照

【&】【"】【<】【>】を変換。

最初の実行で空ファイル(Entity_Test1.txt)が開くので、そこにソース(複数行可)を貼付・保存後に再度スクリプトを実行。

数値文字参照(10進数)へ

文字実体参照へ

OSバージョンなど

OSバージョン、Service Pack、物理メモリ量など

Office のバージョン(2000/2002/2003のみ...不完全かも?)

ファイルのバージョンチェック

※ あまり確認してないのでいまいちかも。

バッチファイル(bat)用。コマンドラインで実行。標準出力

cscript //nologo FileVersion_for_Batch.vbs "パス\ファイル名"

テキストへ書き出し

FileVersion.vbs "パス\ファイル名"

右クリック「送る」メニューやD&Dでもおk。

プラグインなどのバージョンチェック

旧バージョンのチェックはいまいち。仕様が変わる度にスクリプトの修正が必要かも。

めも

関連付け実行

エディタで編集中ファイルのスクリプト実行。ツールバーのボタンなどに登録しておくと便利。

秀丸エディタ
  • コマンド一覧ファイル系関連付けで開く
  • プログラム実行 - wscript "%f"
  • プログラム実行 - cmd /k cscript "%f"
EdTex(EdLeaf)

【外部ツール】の実行、または【ユーザーツール】に登録

  • wscript
    • パス - C:\WINDOWS\system32\wscript.exe
    • パラメータ - "$f"
  • cscript
    • パス - C:\WINDOWS\system32\cscript.exe
    • パラメータ - "$f"
    • 出力結果をリダイレクト
Microsoft Script Editor

MIcrosoft Office に付属。


ほなね