Windows Script Host

WSH@WorkShop

日本語文字を扱う場合は、シフトJIS(ANSI)または、UTF-16LE(BOM付き)にて作成してください。それ以外は文字化けします。
ただし、WSF(Windows Script File)のXMLベースであれば、文字コードを指定することができます。

<?xml version="1.0" encoding="UTF-8"?>
<package>
  <job>
    <script language="JScript">
      <![CDATA[
        WScript.Echo("こんにちは、世界!");
      ]]>
    </script>
  </job>
</package>



'#################################################
'スクリプト名 Ver1.0 2020/0/0

'●使い方
'wscript スクリプト名.vbs	メッセージボックス出力(都度停止します)
'cscript スクリプト名.vbs	コンソール出力

'################################################# 初期設定
'Option Explicit	'変数や定数の宣言を強制
'---+---+---+---+---+---+---+---+---+---+ 定数設定
Const File_Path = "DataDir\Sample.txt"	'値の変更はできません

'---+---+---+---+---+---+---+---+---+---+ 変数設定
Dim bool, num	'変数を宣言します。通常は宣言は不要で代入する値で型が決まります

'真偽値
bool = True : bool = False

'数値
num = 0

'文字列
str = "SAMPLE"

'配列
Dim ary(9)	'0~9の10個の要素を持つ配列を宣言します。※60次元まで宣言可
Dim ary2()	'動的配列を宣言
ary3 = Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") 
aryMax = UBound(ary)	'配列要素の最大番号 この場合は9

'################################################# サブルーチン
'[Public [Default] | Private] Sub xxSub [(arglist)] 	'arglist:[ByVal | ByRef] varname[( )]
'	[Exit Sub]
'End Sub

'[Call] xxSub(arglist)		'Subプロシージャ呼び出し

'################################################# 関数
'[Public [Default] | Private] Function name [(arglist)]	'arglist:[ByVal | ByRef] varname[( )]
'	[name = expression]		'関数の戻り値を指定
'	[Exit Function] 
'End Function 

'rtnCode = [Call] name(arglist)	'Functionプロシージャ呼び出し

'################################################# イニシャル処理
WScript.Echo "処理を開始します。"
'---+---+---+---+---+---+---+---+---+---+ オブジェクト生成
Set objWS = WScript.CreateObject("WScript.Shell")
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
'
'---+---+---+---+---+---+---+---+---+---+ ファイル作成・オープン
'objFS.CreateTextFile "sample.txt"	'ファイル新規作成
'Set objWriteFile = objFS.OpenTextFile("test.txt", 8, True)	'追記モード,存在しない場合は作成

'---+---+---+---+---+---+---+---+---+---+ Fileの有無チェック
'If objFS.FileExists(filePath)=False Then
'	WScript.Echo "ファイルがみつかりません。(" & filePath & ")"
'	WScript.Quit()
'End If

'---+---+---+---+---+---+---+---+---+---+ 起動オプションの有無チェック
'If WScript.Arguments.Count <= 0 Then
'	WScript.Echo "起動オプションが指定されていません。"
'	WScript.Quit()
'End If

'################################################# メイン処理
'******* 演算子 *******
'True:真,False:偽	ブール
'+,-,*,/,\,Mod,^,&	算術演算子
'=,<>,<,>,<=,>=,Is	比較演算子
'Not,And,Or,Xor,Eqv,Imp	論理演算子

'******* 制御 *******
'------ If文 ------
'If condition Then statements [Else elsestatements ] 

'If condition Then
'	[statements]
'[ElseIf condition-n Then
'	[elseifstatements]] . . .
'[Else
'	[elsestatements]]
'End If 

'------- Select Case 文 ------
'Select Case 条件式
'	Case 値1
'		値1の処理
'	Case 値2
'		値2の処理
'	Case Else
'		それ以外の処理
'End Select

'-------- For文 --------
'For i = start To end [Step step]
'	[statements]
'	[Exit For]
'	[statements]
'Next

'For Each element In group
'	[statements]
'	[Exit For]
'	[statements]
'Next [element]

'------- Do Loop 文 --------
'Do [{While | Until} condition]
'	[statements]
'	[Exit Do]
'	[statements]
'Loop

'Do
'	[statements]
'	[Exit Do]
'	[statements]
'Loop [{While | Until} condition]

'-------- While文 --------
'While condition
'	Version [statements]
'Wend

'-------- With文 ---------
'With object
'	statements
'End With

'################################################# 終了処理
'---+---+---+---+---+---+---+---+---+---+ 終了確認
MsgBox "スクリプトを終了します。", vbOKOnly, "WinTitle"

'---+---+---+---+---+---+---+---+---+---+ ファイルクローズ
'oWriteFile.Close	'読取データファイルのクローズ

'---+---+---+---+---+---+---+---+---+---+オブジェクト解放
Set objWS = Nothing
Set objFS = Nothing
'Set oWriteFile = Nothing

WScript.Quit()	'スクリプト終了

'################################################# EOF


'******* 予約定数 *******
vbCr		Chr(13) キャリッジ リターン文字。 
VbCrLf		Chr(13)、Chr(10) キャリッジ リターンとライン フィードの組み合わせ。 
vbFormFeed	Chr(12) フォーム フィード文字。Microsoft Windows では使用できません。 
vbLf		Chr(10) ライン フィード文字。 
vbNewLine	Chr(13)、Chr(10) または Chr(10) プラットフォームで指定した改行文字。現在のプラットフォームに適切ないずれかを使用します。 
vbNullChar	Chr(0) 値 0 を持つ文字列。 
vbNullString	値 0 を持つ文字列 長さ 0 の文字列 ("") とは異なります。外部プロシージャを呼び出す場合に使用します。 
vbTab Chr(9)	タブ文字 (横)。 

'******* 変数 *******
'記述には大文字・小文字の区別がありません。
'データ型はVariant型として定義され、代入された値によって自動的処理されます。
'型を指定することもできます。
'Integer、Long、Byte、Single、Double、Currency、Date、String、Boolean、Error、Object
Dim filePath As Integer
'また、関数を使ってデータ型を変換することもできます。
CInt()、CStr()、CDate()、CDbl()、CLng()、CByte()など

'******* 文字列 *******
Len()	文字列の長さ
LCase()小文字、UCase()大文字に変換
InStr(str, s1)先頭から文字検索、InStrRev(str, s1)末尾から文字検索
Left(str, n)左端からn文字取得、Right()右端からn文字取得
Mid(str, i, n)指定位置から指定文字数を取得
Trim()先頭と末尾、LTrim()先頭、RTrim()末尾のスペースを取ります。
Replace(str, s1, s2)s1をs2に置換
StrComp(str1, str2, prm)文字を比較。str1str2なら1、str1=str2なら0を返す。prmは0:バイナリ、1:テキストで比較

'******* 配列 *******
str = "A,B,C,D" : ary = Split(str,",")
Ubound(ary)は配列の最大インデックス、Lbound(ary)は配列の最小インデックス取得
ary = Array("a","b","c") : WScript.Echo Join(ary)	'結果はa b c
WScript.Echo Join(ary,",")	' 結果はa,b,c
ReDim ary()	'配列を再定義。要素の中身はクリア
ReDim Preserve ary()	'配列を再定義。要素の中身は保持

'******* 日時 *******
Now()	'現在の日時 2007/06/01 13:01:14
Date()	'現在日 2007/06/01
Time()	'現在時 13:01:14
Year()年、Month()月、Day()日、Hour()時、Minute()分、Second()秒をそれぞれ取得。
Weekday()週を数字(1:日曜、2:月曜、…、7:土曜)、WeekDayName()週を漢字(日曜など)で取得
DateDiff("yyyy", strDate1, strDate2)差を年で取得、DateDiff("s", strDate1, strDate2)秒で取得
DateAdd("d", 1, strNow)日を+1で取得、DateAdd("m", -10, strNow)分を-10で取得

'******* 表示&入力 *******
MsgBox "メッセージ"[, ボタン, "タイトル"]
'	ボタン種:vbOKOnly、vbOKCancel、vbAbortRetryIgnore、vbYesNoCancel、vbYesNo、vbRetryCancel
'	アイコン:vbCritical、vbQuestion、vbExclamation、vbInformation
'	ボタンデフォルト:vbDefaultButton1、vbDefaultButton2、vbDefaultButton3、vbDefaultButton4
'	モーダル:vbApplicationModal(アプリ中断)、vbSystemModal(全アプリ中断) 
str = MsgBox("今からバックアップを行います。いいですか?", vbYesNo + vbDefaultButton2)
'	戻り値:1 vbOK、2 vbCancel、3 vbAbort、4 vbRetry、5 vbIgnore、6 vbYes、7 vbNo
InputBox "メッセージ"[,"タイトル"][,初期値]
str = InputBox("メッセージ"[,"タイトル", "初期値", X座標, Y座標])
objWS.Popup "メッセージ"[,表示秒数, "ウィンドウタイトル", ボタン]
result = objWS.Popup("メッセージ"[,表示秒数, "ウィンドウタイトル", ボタン])
objWS.SendKeys "1{+}{ENTER}"	'1 + Enter キーを自動入力 
'	特殊キー{BS}{BREAK}{CAPSLOCK}{DEL}{END}{ESC}{HOME}{INS}{NUMLOCK}{PRTSC}{SCROLLLOCK}{TAB}
'	ファンクションキー{F1}{F2}・・・{F12}
'	記号キー{+} {^} {%} {~} {[} {]} {{} {}} {(} {)}
'	カーソルキー{UP}{DOWN}{RIGHT}{LEFT}{PGUP}{PGDN}
'	組み合わせで使うShift=+,Ctrl=^,Alt=%

'******* オブジェクト生成(インスタンス化) *******
'******* WScriptオブジェクト ******* WSHが起動と同時にインスタンス化されます
WScript.Quit()			'スクリプト終了(コマンドラインにエラーコードを返す際は、0または9などを設定。省略時は0)
WScript.Arguments(0)		'コマンドラインのパラメータ(0~)
WScript.Arguments.Count 	'コマンドラインのパラメータの個数
WScript.Sleep 10000 		'ウェイト10秒
WScript.Echo "メッセージ" 	'メッセージ表示
WScript.StdIn.ReadLine()	'標準入力から文字列を1行読み込む ※cscript.exeでのみ使用可
WScript.StdIn.Read(5)		'標準入力から文字列を5文字読み込む ※cscript.exeでのみ使用可
WScript.StdOut.WriteLine "文字列"	'標準出力に文字列を1行書き込む ※cscript.exeでのみ使用可
WScript.StdOut.Write "文字列"		'標準出力に文字列を書き込む(改行なし) ※cscript.exeでのみ使用可
WScript.Interactive = false	'スクリプトのモードを "バッチ" に設定。ユーザーとの対話はサポートされません。

'******* WScript.Shellオブジェクト *******
Set objWS = WScript.CreateObject("WScript.Shell")
'-------- アプリケーション起動 ----------------
objWS.Run プログラム名, [intWindowStyle], [bWaitOnReturn]
objWS.Run """プログラム名(フルパス)"""	'コマンド実行
objWS.Run Chr(34) & FilePath & Chr(34) 	'コマンド実行
objWS.Exec "calc"	'コマンド ラインのアプリケーションのみ実行可です。ステータス情報やエラー情報の取得ができる。
objWS.AppActivate "Calculator"	'電卓をアクティブにする。※正常にアクティブにできた場合は、戻り値がTrue
'-------- レジストリ操作 ----------------
objWS.RegRead("HKEY_CURRENT_USER\Software\Test\")		'レジストリから値を取得する。
objWS.RegWrite "HKCU\Software\Test\", 1, "REG_DWORD"	'値と型名を指定します。(REG_SZは文字列、REG_DWORDは数値、REG_BINARYはバイナリ、REG_MULTI_SZは配列、REG_EXPAND_SZは展開可能な文字列を表します。)
objWS.RegDelete "HKCU\Software\Test\"			'レジストリから値を削除する。

'**************** ファイル操作 ******************
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
Set oTxtFile = FS.OpenTextFile(filePath, iomode, create)	'txtファイルを読取モードでオープン(iomode[1:読取、2:書込、8:追記], create[True:作成、False:しない])
oTxtFile.Close	'txtファイルのクローズ
objFS.CreateTextFile "ファイルパス"	'ファイル作成
objFS.DeleteFile "ファイルパス"		'ファイル削除
objFS.CopyFile "コピー元", "コピー先"	'ファイルコピー
objFS.MoveFile "移動元", "移動先"		'ファイル移動

objFS.CreateFolder "フォルダパス"		'フォルダ作成
objFS.DeleteFolder "フォルダパス"		'フォルダ削除
objFS.CopyFolder "コピー元","コピー先"	'フォルダコピー
objFS.MoveFolder "移動元","移動先"	'フォルダ移動

If objFS.FileExists("ファイルパス")=True Then	'ファイル有無確認
If objFS.FolderExists("フォルダパス")=True Then	'フォルダ有無確認

oTxtFile.Write "文字列"	'書き込み(改行なし)
oTxtFile.WriteLine "文字列"	'1行書き込み(改行あり)

'-------- TXTファイルの書き換えサンプル ----------------
Dim oTxtFile, oTmpFile
Dim filePath,tmpPath
filePath = "sample.txt"
tmpPath = objFS.GetTempName	'ランダムなファイル名取得
Set oTxtFile = objFS.OpenTextFile(filePath, 1, False)	'txtファイルを読取モードでオープン
Set oTmpFile = objFS.OpenTextFile(tmpPath, 2, True)	'txtファイルを書込モードでオープン
Do Until oTxtFile.AtEndOfStream
	dataLine = oTxtFile.ReadLine	'1行読み込み
	If dataLine="abc" Then
		oTmpFile.WriteLine "def"	'1行書き込み
	Else
		oTmpFile.WriteLine dataLine	'1行書き込み
	End If
Loop
oTxtFile.Close	'txtファイルのクローズ
oTmpFile.Close	'txtファイルのクローズ
objFS.DeleteFile filePath, True
objFS.MoveFile tmpPath, filePath
oTxtFile = Nothing
oTmpFile = Nothing

'-------- UTF-8ファイル ----------------
det oStream = CreateObject("ADODB.Stream")
oStream.Type = 2	'1:バイナリ、2:テキスト
oStream.Charset = "UTF-8"	'既定値はUnicode、Shift_JISやEUCなど
oStream.LineSeparator = -1	'-1:CrLf、10:Lf、13:Cr
'読み込み
oStream.Open
objStream.LoadFromFile "sample.txt"
data = objStream.ReadText(-2)	'読み込み -2:テキスト全文、-1:テキスト1行
oStream.Close
'書き込み
oStream.Open
oStream.Position = oStream.Size	'ポインタを終端へ移動
oStream.WriteText "追加データ", 1	'0:改行なし、1:あり
oStream.SaveToFile "output.txt", 2	'1:新規作成、2:上書き
oStream.Close

'-------- zipファイル解凍 ----------------
Dim oSA
Dim exFolder,zipFile
exFolder = "出力フォルダのパス"
zipFile = "zipファイルのパス"
If oFs.FolderExists(exFolder)=True Then
	Set oSA = CreateObject("Shell.Application")
	With oSA
		.NameSpace(exFolder).CopyHere .NameSpace(zipFile).Items
	End With
Else
	WScript.Echo "zipファイルの解凍先フォルダがみつかりません。(" & exFolder & ")"
End If
oSA = Nothing

'-------- XMLファイル取得 ----------------
Set objXML = WScript.CreateObject("MSXML2.DOMDocument")
objXML.load("sample.xml")
For Each objNode In objXML.childNodes
	For Each objItem In objNode.childNodes
	   	objItem.nodeName & "=" & objItem.firstChild.nodeValue
	Next
Next

'sample.xml
<?xml version="1.0" encoding="shift-jis"?>
<data>
	<name>伊藤</name>
	<address>東京都</address>
</data>

'**************** エクセル操作 ******************
'エクセルオブジェクトを作成して、エクセルVBAのメソッドやプロパティが使えます。
Dim objExcel
Set objExcel = CreateObject("Excel.Application")	'エクセルオブジェクトを作成します
objExcel.Quit	'エクセルを終了
Set objExcel = Nothing	'オブジェクト開放

objExcel.Visible = True	'エクセル画面を表示(デフォルト:非表示)
objExcel.Workbooks.Open "c:\book.xls"	'ワークブックを開く
objExcel.Workbooks.Add			'ワークブック新規作成
bjExcel.Workbooks(1).Close		'ワークブックを閉じる
objExcel.Workbooks(1).Save		'ワークブックの保存
objExcel.Workbooks(1).SaveAs ("c:\book.xls")	'名前を付けて保存
Set objSelection = objExcel.Workbooks(1).Worksheets(1).Range("B2:D10")	'範囲を選択。※Selectionは使えないため選択した範囲はオブジェクトとして保存します。
objExcel.DisplayAlerts = False	'各種の確認ダイアログを非表示

'**************** Access操作 ******************
Dim objAccess
Set objAccess = CreateObject("Access.Application")	'Accessオブジェクトを作成します

'**************** WMI ******************
'システムを管理するためのインターフェース
'代表的なWMIクラス
Win32_Service サービス情報(サービス名、ステータスなど)  
Win32_Process プロセス情報(プロセス名、使用メモリ容量など)  
Win32_LogicalDisk ディスク情報(ディスク容量、空き容量など)  
Win32_Processor CPU情報(CPU使用率など)  
Win32_OperatingSystem OS情報(プロダクト名、プロダクトタイプなど)  
Win32_NTEventLogFile イベントログ情報(イベント内容など)  
Win32_LogicalMemoryConfiguration メモリ情報(物理メモリ容量など) 

'プロセスの表示をするサンプルソース
Set Process = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_Process")
For Each P In Process
	str = str & P.Description & ":" & CStr(P.ProcessId) & vbCrLf
Next
WScript.Echo str

'------- プロセス終了 -------
Sub ProcKillSub(ProcessName)
	Dim oClassSet, oClass
	Set oClassSet = WScript.CreateObject("WbemScripting.SWbemLocator")_
		.ConnectServer.ExecQuery("Select * From Win32_Process Where Caption='" & ProcessName & "'")
	For Each oClass In oClassSet
		oClass.Terminate
	Next
	Set oClassSet = Nothing
	Set oClass = Nothing
End Sub

'**************** ADO ******************
'ADO(ActiveX Data Objects)とは、WSHで利用できるデータベースへのアクセス部品のことです。
'Access、SQLServer、Oracle、Excelへのデータ操作が可能になります。
'ただし、CSVテキストドライバとしての仕様上、255を超える項目数、255を超えるサイズはNG
Set objCon = Server.CreateObject("ADO.Connection")	'ADO コネクション
Set objRS = Server.CreateObject("ADO.Recordset")	'ADO レコードセット

'データベース接続情報
objCon.ConnectionString = "Data Source=データソース名"
'データ取得
objRS.Open "select * from テーブル名", objCon
objRS.Close
objCon.Close

'オブジェクト解放
Set objRS = Nothing
Set objCon = Nothing

'------- エクセルファイルでのデータベース操作 -------
Dim objADO
Set objADO = CreateObject("ADODB.Connection")	'ADOオブジェクトを作成します
'ファイルオープン
objADO.Open "Driver={Microsoft Excel Driver (*.xls)}; " & "DBQ=c:\kakaku.xls;" & "ReadOnly=0"	'0:更新可、1:リードオンリ
'レコード追加
objADO.Execute "INSERT INTO [Sheet1$] (日付, 店舗コード) VALUES ('2003/11/30', 'T5130')"
'レコード更新
objADO.Execute "UPDATE [Sheet1$] SET データ番号 = '100', 担当者 = '00M5365', 会員番号 = '5144M200210724' WHERE 店舗コード='Z5130'"	'U_TBL範囲設定
'データを抽出
Set objRS = objADO.Execute("select * from [Sheet1$] where 店舗コード='T5144'")	'SQLを実行し、店舗コードがT5144のデータを抽出します
Do Until objRS.Eof = True
	WScript.echo "店舗コード:" & objRS("店舗コード") & " 価格:" & objRS("価格")	'フィールド値の表示
	objRS.MoveNext	'カーソルを次の行へ
Loop

SELECT * FROM U_TBL WHERE 顧客番号 >= 100	'設定した範囲「U_TBL」データを取得するSELECTステートメントの例

'------ CSV(テキストデータ)でのデータベース操作 -------
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & "DBQ=c:\sample;" & "ReadOnly=0"	'DBQにはフォルダを指定する。
objADO.Execute "INSERT INTO kakaku.csv (日付, 店舗コード) VALUES ('2003/11/30', 'T5130')"	'レコード追加
Set objRS = objCon.Execute("select * from kakaku.csv where 店舗コード='T5144'")	'データ抽出
'※CSVファイルの更新は、レコード追加のみ可

'**************** 起動オプション ******************
'wscript、cscriptでのオプション
'//B	バッチモードでスクリプトを実行します。ユーザープロンプトおよびスクリプト エラーをコマンド ライン表示しません。
'//D	アクティブデバッグを使用可能にします。
'//E:engine	指定したスクリプトエンジンでスクリプトを実行します。
'//H:CScript	既定のスクリプトホストを CScript.exe に変更します。
'//H:WScript	既定のスクリプトホストを WScript.exe に変更します。(既定値)
'//I	対話モードでスクリプトを実行します。(既定値)バッチ モードとは逆に、ユーザー プロンプトおよびスクリプト エラーの表示を有効にします。
'//Job:xxxx	指定した JobID を .wsf ファイルから実行します。
'//logo	バナーを表示します。nologo の逆の設定です。(既定値)
'//nologo	実行時にバナーを表示しません。
'//S	このユーザーに対して、現在のコマンドラインオプションを保存します。
'/T:nn	スクリプトの実行を継続できる時間の上限 (タイムアウト) を設定します。既定では、スクリプトは制限なしで実行されます。このパラメータを設定すると、スクリプトが長時間にわたって実行されるのを防止できます。
'//U	コマンド ライン出力を Unicode にします。CScript には、Unicode と ANSI を自動的に判別する機能はありません。既定の設定では、ANSI が使用されます。
'//X	スクリプトをデバッガで実行します。
'//?	オプションの説明を表示します。

'**************** 例外処理 ******************
'スクリプトのデバッグを行う際は、エラーの特定が難しくなるためデバッグ後に例外処理を追加してください。
'------- エラー処理ルーチン -------
Sub ErrSub()
	If Err.Number <> 0 Then
		Select Case Err.Number
		Case 53
			WScript.Echo "ファイルが見つかりません。"
		Case 54
			WScript.Echo "ファイルのモードが不正です。"
		Case 55
			WScript.Echo "ファイルは既に開かれています。"
		Case 58
			WScript.Echo "すでにファイルが存在します。"
		Case Else
			WScript.Echo "予期しないエラーが発生しました。" & vbCrLf & _
					"エラー番号:" & Err.Number & vbCrLf & _
					"エラー詳細:" & Err.Description
		End Select
	End If
End Sub

On Error Resume Next	'エラー時も処理続行
'処理
ErrSub()	'エラー処理ルーチン呼び出し
On Error Goto 0	'エラー処理終了

ページトップへ戻る