Windowsスクリプト

どっとPCに連載した記事のまとめです。

マニュアルは、ここの「Windows Script 5.6 日本語版」を参照してください。

Sample1.vbs:たった一行でもプログラムです。

msgbox(“ハローワールド”)

Sample2.vbs:変数というものにより、さまざまな値に対応できます。

namae = inputbox("お名前は?")
msgbox(namae)

Sample3.vbs:変数が左辺と右辺に同じものがきています。&は文字列の連結です。

namae = inputbox("お名前は?")
namae = namae & "さん、こんちは"
msgbox(namae)

Sample4.vbs:IFを使うことで、知性があるように見えます。

suuji = inputbox("数字をいれて")
if suuji > 5 then kotae = "5より大きい" else kotae = "5と同じか小さい"
msgbox ( suuji & "は" & kotae )

Sample5.vbs:文字列の比較は同じか、同じでない、だけです。

moji = inputbox("TAROUといれて")
if moji = "TAROU" then kotae = "そうです" else kotae =? moji & "だったよ"
msgbox ( kotae )

Sample6.vbs:省略値をセットして、IFで次々に比べます。

suuji = inputbox("数字をいれて")
kotae = "5以上"
if suuji = 1 then kotae = "1です"
if suuji = 2 then kotae = "2です"
if suuji = 3 then kotae = "3です"
if suuji = 4 then kotae = "4です"
msgbox ( suuji & "は" & kotae )

Sample7.vbs:同じ条件で場合わけする時は、Select-Caseを使うと便利です。

suuji = inputbox("数字をいれて")
Select Case suuji
? case 1
? ? kotae = "1です"
? Case 2
? ? kotae = "2です"
? Case 3
? ? kotae = "3です"
? Case 4
? ? kotae = "4です"
? Case Else
? ? kotae = "5以上"
End Select? ?
msgbox ( suuji & "は" & kotae )

Sample8.vbs:条件がふたつある場合は各々の条件で同じ条件を調べます。

hot = msgbox("お湯の蛇口は開いていますか?",vbYesNo)
cold = msgbox("お水の蛇口は開いていますか?",vbYesNo)

if hot = vbYes then
? if cold = vbYes then
? ? msgbox ("暖かいお湯がでています")
? else
? ? msgbox ("熱いお湯がでています")
? end if
else
? if cold = vbYes then
? ? msgbox ("冷たい水がでています")
? else
? ? msgbox ("水は出ていません")
? end if
end if

Sample9.vbs:水が出ていないか、といった特定の条件だけを調べたい場合は、ひとつのif文中でAND,ORで調べます。

hot = msgbox("お湯の蛇口は開いていますか?",vbYesNo)
cold = msgbox("お水の蛇口は開いていますか?",vbYesNo)

if (hot = vbNo) AND (cold = vbNo) then
? msgbox ("水は出ていません")
else
? msgbox ("湯か水がでています")
end if

Sample10.vbs:sample8の逆、つまり水かお湯がでている時の書き方。

hot = msgbox("お湯の蛇口は開いていますか?",vbYesNo)
cold = msgbox("お水の蛇口は開いていますか?",vbYesNo)

if (hot = vbYes) OR (cold = vbYes) then
? msgbox ("湯か水がでています")
'-- シャドウ開始
else
? msgbox ("水は出ていません")
'-- シャドウおわり
end if

Sample11.vbs:指定回数繰り返す for-nextの例

kachi = 0
aiko? = 0
kaisu = 1000000
Randomize
for i=1 to kaisu
? a=Int(rnd*3)+1
? b=Int(rnd*3)+1
? if a=b then aiko = aiko + 1
? if (a=1) AND (b=2) then kachi = kachi + 1
? if (a=2) AND (b=3) then kachi = kachi + 1
? if (a=3) AND (b=1) then kachi = kachi + 1
next
msgbox "Aさんは" & kaisu & "回じゃんけんして," & kachi & "回勝ち," & aiko & "回あいこで," & kaisu-kachi-aiko & "回負けました。"

Sample12.vbs:AかBが先に10回勝ったら終わり Do while-Loopの例

a_kachi = 0
b_kachi = 0
kaisu = 0
senshu = 10
Randomize
Do while (a_kachi < senshu) and (b_kachi < senshu)
? a=Int(rnd*3)+1
? b=Int(rnd*3)+1
? kaisu= kaisu+1
? if (a=1) AND (b=2) then a_kachi = a_kachi + 1
? if (a=2) AND (b=3) then a_kachi = a_kachi + 1
? if (a=3) AND (b=1) then a_kachi = a_kachi + 1
? if (b=1) AND (a=2) then b_kachi = b_kachi + 1
? if (b=2) AND (a=3) then b_kachi = b_kachi + 1
? if (b=3) AND (a=1) then b_kachi = b_kachi + 1
' msgbox "速報:" & kaisu & "回じゃんけんをし、Aは" & a_kachi & "回勝ち、Bは" & b_kachi & "回勝ってます"
loop
msgbox kaisu & "回じゃんけんして" & "Aさんは" & a_kachi _
 & "回勝ち、Bさんは" & b_kachi & "回勝ちました。"

Sample13.vbs:Sample12を論理ごとにサブルーチンにしたFunctionの例

a_kachi = 0
b_kachi = 0
kaisu = 0
senshu = 10
Randomize
Do while (a_kachi < senshu) and (b_kachi < senshu)
? ' --- janken関数でa,bのテをきめる
? a=janken()
? b=janken()

? ' --- hantei関数は勝ったほうを教えてくれる
? select case hantei(a,b)
? ? case "a" a_kachi = a_kachi + 1
? ? case "b" b_kachi = b_kachi + 1
? ? case else
? end select

? kaisu= kaisu+1
loop

msgbox kaisu & "回じゃんけんして" & "Aさんは" & a_kachi _
 & "回勝ち、Bさんは" & b_kachi & "回勝ちました。"

' ----- ジャンケンの結果を出すサブルーチン ------
function janken
? janken = Int(rnd*3)+1
end function

' ----- ジャンケンの結果判定サブルーチン ------
function hantei(a_te,b_te)

? if (a_te=1) AND (b_te=2) then hantei = "a"
? if (a_te=2) AND (b_te=3) then hantei = "a"
? if (a_te=3) AND (b_te=1) then hantei = "a"
? if (b_te=1) AND (a_te=2) then hantei = "b"
? if (b_te=2) AND (a_te=3) then hantei = "b"
? if (b_te=3) AND (a_te=1) then hantei = "b"

end function

Sample14.vbs:ファイルシステム・オブジェクトの力で移動

SourceDir = "C:ホームページHTML"
DestDir = "C:ホームページimages"
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
rc = fso.MoveFile( SourceDir & "*.jpg", DestDir)
rc = fso.MoveFile( SourceDir & "*.gif", DestDir)
rc = fso.MoveFile( SourceDir & "*.bmp", DestDir)

set fso = Nothing

msgbox "処理終了"

Sample15.vbs:特定のファイル名の名前変更(正規表現・ファイルシステムオブジェクトの利用)

TargetDir = "C:testfolder"
TargetPattern = "(.txt)$"

Set fso = CreateObject("Scripting.FileSystemObject")

Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = TargetPattern? '検索パターン
RegEx.IgnoreCase = True? ?? '大文字と小文字を区別しないように設定

for each afile in fso.GetFolder( TargetDir ).Files

? if RegEx.Test( afile.name ) then
? ? newname = replace( afile.name, ".", "_old.")
? ? fso.MoveFile TargetDir & afile.name , TargetDir & newname
? end if

next

set fso = Nothing
set RegEx = Nothing

msgbox "処理終了"

Sample16.vbs:特定のファイル名で指定日より古いファイルの名前変更(正規表現・ファイルシステムオブジェクトの利用)

TargetDir = "C:testfolder"
DueDate = "2002/07/30"
TargetPattern = "(.txt)$"

Set fso = CreateObject("Scripting.FileSystemObject")

Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = TargetPattern? '検索パターン
RegEx.IgnoreCase = True? ?? '大文字と小文字を区別しないように設定

for each afile in fso.GetFolder( TargetDir ).Files

? if afile.datelastmodified < datevalue( DueDate ) _
? '新機能
? AND RegEx.Test( afile.name ) then

? ? newname = replace( afile.name, ".", "_old.")
? ? fso.MoveFile TargetDir & afile.name , TargetDir & newname

? end if

next

set fso = Nothing
set RegEx = Nothing

msgbox "処理終了"

Sample17.vbs:再帰プログラム(ご先祖様の合計)

msgbox senzo(3) & "人" ' ここに世代数

Function senzo(n)
? if n=1 then
? ? senzo = 2
? else
? ? senzo = 2^n + senzo(n-1)
? end if
End Function

Sample18.vbs:再帰プログラム(サブフォルダを探索し、ファイルサイズの合計をする)

TargetFolder = "C:windows"? ' サイズを計算するフォルダを指定

Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder( TargetFolder )
allbyte = TraversFolder( oFolder )
msgbox formatnumber(allbyte/ (1024*1024) ,4) & "メガバイト"

set fso = Nothing

Function TraversFolder(ofolder)
? FolderSize = 0

? For Each Afolder In ofolder.SubFolders
? ? FolderSize =FolderSize + TraversFolder( Afolder )
? Next

? For each Afile in ofolder.Files
? ? FolderSize = FolderSize + afile.size
? next

? TraversFolder = FolderSize
End Function

Sample19.vbs:フォルダー検索プログラム(再帰プログラムとファイルのI/O技の組み合わせ)

Do while SearchChar = ""
? SearchChar =InputBox("探したい言葉を指定してください。")
Loop
Do while TargetFolder = ""
? TargetFolder = InputBox("探すフォルダーを指定してください。でおわること。")
Loop

Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder( TargetFolder )
filelist = TraversFolder( oFolder, SearchChar )
if filelist = "" then
? filelist = SearchChar & "は見つかりません。"
end if
msgbox filelist

set fso = Nothing

'フォルダーの探索
Function TraversFolder(ofolder, SearchChar)
? FileList = ""
? '今のフォルダー内を探索
? For each Afile in ofolder.Files
? ? if CheckChar( afile.path, SearchChar) then
? ?? ?FileList = FileList & afile.path & vbCrLf
? ? end if
? next
? 'サブフォルダーを再帰処理
? For Each Afolder In ofolder.SubFolders
? ? FileList =? FileList & TraversFolder( Afolder, SearchChar )
? Next

? TraversFolder = FileList

End Function

'ひとつのファイルの中に文字列があるか調べる
function CheckChar( file, SearchChar)
? alltext = ReadAllFile( file )
? if Instr(1, alltext, SearchChar, 1) >= 1 then
? ? CheckChar = True
? else
? ? CheckChar = False
? end if
End Function

'ひとつのファイルを読み取る
function ReadAllFile( file )
? Set fso = CreateObject("Scripting.FileSystemObject")
? Set fio = fso.OpenTextFile( file, 1)
? ReadAllfile = fio.readall
? ' msgbox ReadAllfile
? fio.Close
? set fso = Nothing
End Function

Sample20.vbs:フォルダー検索プログラム(結果をIEに書き出す。プログラム変更の例です)

SearchChar =InputBox("探したい言葉を指定してください。",,"test")
TargetFolder = InputBox("探すフォルダーを指定してください。でおわること。",,"D:temp")
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder( TargetFolder )
filelist = TraversFolder( oFolder, SearchChar )
dummy = ShowIE( SearchChar, filelist)
set fso = Nothing

'フォルダーの探索
Function TraversFolder(ofolder, SearchChar)
? FileList = ""
? '今のフォルダー内を探索
? For each Afile in ofolder.Files
? ? if CheckChar( afile.path, SearchChar) then
? ?? ?FileList = FileList & afile.path & "
"
? ? end if
? next
? 'サブフォルダーを再帰処理
? For Each Afolder In ofolder.SubFolders
? ? FileList =? FileList & TraversFolder( Afolder, SearchChar )
? Next

? TraversFolder = FileList

End Function

'ひとつのファイルの中に文字列があるか調べる
function CheckChar( file, SearchChar)
? alltext = ReadAllFile( file )
? if Instr(1, alltext, SearchChar, 1) >= 1 then
? ? CheckChar = True
? else
? ? CheckChar = False
? end if
End Function

'ひとつのファイルを読み取る
function ReadAllFile( file )
? Set fso = CreateObject("Scripting.FileSystemObject")
? Set fio = fso.OpenTextFile( file, 1)
? ReadAllfile = fio.readall
? ' msgbox ReadAllfile
? fio.Close
? set fso = Nothing
End Function

'ファイルをIE上に書き出す
Function ShowIE( Word, Text )
? set objIE = CreateObject("InternetExplorer.Application")
? objIE.navigate("about:blank")
? objIE.visible = True
? objIE.document.open
? objIE.document.write( "" )
? objIE.document.write( "

" & Word & "の含まれるファイル

" ) ? objIE.document.write( Text ) ? objIE.document.write( "" ) ? objIE.document.close End Function

コメント