(for Internet Explorer)
← ▼ ▲
↑
.vbs ファイルにドロップする
Sub main()
Dim r, w, r_path, w_path, line
If WScript.Arguments.Unnamed.Count < 1 Then
echo "変換したいファイルをドラッグ＆ドロップしてください。"
Exit Sub
End If
r_path = WScript.Arguments.Unnamed(0)
w_path = GetParentAbsPath( r_path ) +"\"+ g_fs.GetBaseName( r_path ) +".csv"
Set r = g_fs.OpenTextFile( r_path )
Set w = g_fs.CreateTextFile( w_path, True, False )
Do Until r.AtEndOfStream
line = r.ReadLine()
'// ここに変換処理を記述する
w.WriteLine line
Loop
End Sub
.csv
'// ここに変換処理を記述する
← ▼ ▲
終了、返り値（エラーレベル）を指定する
WScript.Quit 21
サブ・プロシージャの中で呼び出しても、プログラムは終了します。
WScript.exe, CScript.exe の返り値（エラーレベル）は、WScript.Quit で指定します。
WScript.Quit を呼ばないで終了した場合だけでなく、スクリプト内で例外が発生した場合も、
返り値は 0 になります。
→ 標準入出力、リダイレクト、エラーレベル
cscript.exe のパラメータに指定した VBS ファイルが見つからないときは、1 になります。
Shell::Run
Shell::Exec
で起動したスクリプトは、返り値を取得できません。
または
RunProg (vbslib)
を使ってスクリプトを起動してください。
関連
→ Class_Terminate （デストラクタ）
→ vbslib のエラー発生時の動作
指定時間後も動いていたら、強制終了する
WScript.Timeout = 5 '//(sec)
← ▼ ▲
WScript.exe a.vbs param1 ... ウィンドウ版
CScript.exe [//nologo] a.vbs param1 ... コンソール版
WSHを起動する
コマンドプロンプトから、
Set sh = WScript.CreateObject("WScript.Shell")
sh.Run "notepad.exe a.txt"
sh = Empty
メモ帳を起動する（.exe プログラムの起動）
WSH実用マニュアル[その他]
> によるリダイレクトはできません
→ 標準入出力、リダイレクト
→ WScript.Shell::Run
vbs ファイルを cscript.exe で起動するようにエクスプローラーを設定する
vbs ファイルをダブルクリックしたら、cscript.exe を実行するようにエクスプローラーを設定しま
す。 右クリック・メニューには、「コマンドプロンプトで開く」 と表示されます。
cscript /H:cscript
cscript /H:wscript
vbs ファイルをダブルクリックしたら、wscript.exe を実行するようにエクスプローラーを設定しま
す。 右クリック・メニューには、「開く」 と表示されます。
← 管理者として実行したコマンド・プロンプトで入力してください
vbs ファイルに文法エラーがあったときに、エラーメッセージを確認できないため、
お勧めしません。
→ WSHを起動する
→ 常に cscript.exe で実行する （コマンドプロンプトを出す）
→ vbs ファイルを cscript.exe で起動するようにエクスプローラーを設定する
← ▼ ▲
常に cscript.exe で実行する （コマンドプロンプトを出す）
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
Dim system32_path : system32_path = g_sh.ExpandEnvironmentStrings( "%windir%\system32" )
If LCase( Right( WScript.FullName, 11 ) ) = "wscript.exe" Then
Dim cmdline : cmdline = _
system32_path+"\cmd /K cscript.exe //nologo """+WScript.ScriptFullName+""""
For i=0 To WScript.Arguments.Count - 1
If InStr( WScript.Arguments(i), " " ) = 0 Then _
cmdline=cmdline+" "+WScript.Arguments(i) _
Else cmdline=cmdline+" """+WScript.Arguments(i)+""""
Next
CreateObject("WScript.Shell").Run cmdline
WScript.Quit 0
End If
パラメータがあるとき
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
Dim system32_path : system32_path = g_sh.ExpandEnvironmentStrings( "%windir%\system32" )
If LCase( Right( WScript.FullName, 11 ) ) = "wscript.exe" Then
CreateObject("WScript.Shell").Run _
system32_path+"\cmd /K cscript.exe //nologo """+WScript.ScriptFullName+""""
WScript.Quit 0
End If
パラメータがないとき
実行後にコマンドプロンプトを閉じるときは、Run のパラメーターに "&exit" を追加してください。
デバッガを起動するときは、Run のパラメーターに //x を追加してください。
関連
→ ChangeScriptMode
→ cscript 環境変数
Set g_sh = WScript.CreateObject( "WScript.Shell" )
If g_sh.ExpandEnvironmentStrings( "%ProgramFiles(x86)%" ) = "%ProgramFiles(x86)%" Then
If LCase( Right( WScript.FullName, 11 ) ) = "wscript.exe" Then _
g_restart_cmd_exe = "%windir%\system32\cmd" '// For 32bit Windows
Else
If LCase( Right( WScript.FullName, 11 ) ) = "wscript.exe" or _
LCase( Right( WScript.FullName, 20 ) ) = "system32\cscript.exe" Then _
g_restart_cmd_exe = "%windir%\SysWOW64\cmd" '// 32bit cmd.exe for 64bit Windows
End If
If not IsEmpty( g_restart_cmd_exe ) Then
g_sh.Run g_sh.ExpandEnvironmentStrings( g_restart_cmd_exe )+_
" /K cscript.exe //nologo """+ WScript.ScriptFullName +""""
WScript.Quit 0
End If
WScript.Echo WScript.FullName
64bit Windows でも 32bit cmd,exe を起動し、パラメータがないとき
→ 32ビットWindows と 64ビットWindows の WSH
参考
← ▼ ▲
Set sh = WScript.CreateObject("WScript.Shell")
sh.Run "sub.vbs param1",1,True
Set sh = Nothing
別のスクリプトを呼び出す
終わるまで待つ（省略するとFALSE）
通常のウィンドウ（省略可能）
呼び出し先が異なるフォルダにあるとき、カレントフォルダは、
呼び出し元のフォルダのままになっているので、呼び出し先で、
次のようにしてカレントフォルダを移動するとよいでしょう。
Set fs = CreateObject("Scripting.FileSystemObject")
Set sh = WScript.CreateObject("WScript.Shell")
oldDir = sh.CurrentDirectory
sh.CurrentDirectory = fs.GetParentFolderName( Wscript.ScriptFullName )
sh.CurrentDirectory = oldDir
Set sh = Nothing
Set fs = Nothing
（主な処理をここに書く）
WScript.Sleep( 1000 )
WScript.Quit
（cscript.exe では、別のコマンドプロンプト・ウィンドウが表示されてしまいます。）
または
WScript.CreateObject("WScript.Shell").Run "sub.vbs param1",,True
← ▼ ▲
別のスクリプトを、オプション付きで起動する
RunWithOption "main.vbs", "/opt1"
Sub RunWithOption( FName, Opt )
Dim g_fs : Set g_fs = CreateObject( "Scripting.FileSystemObject" )
Dim cmdline : cmdline = "cmd /K cscript.exe //nologo """+g_fs.GetParentFolderName( _
WScript.ScriptFullName)+"\" + FName + """ " + Opt
For i=0 To WScript.Arguments.Count - 1
If InStr( WScript.Arguments(i), " " ) = 0 Then _
cmdline=cmdline+" "+WScript.Arguments(i) _
Else cmdline=cmdline+" """+WScript.Arguments(i)+""""
Next
CreateObject("WScript.Shell").Run cmdline
WScript.Quit 0
End Sub
main_opt1.vbs
main.vbs
/opt1
← ▼ ▲
Option Explicit
Set g_fs = CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.OpenTextFile( "vbslib.vbs" )
Execute f.ReadAll()
f = Empty
別のスクリプトをインクルードする（Execute, ExecuteGlobal）
(cache)
→ Deep Decryption - VBScript Tips - Execute とExecuteGlobal (Web)
→ ExecuteGlobal ステートメント (Web)
インクルードしようとするスクリプトにエラーが発生すると、メインでエラーが発生したよう
にエラーが出てしまいます。 エラーメッセージの行番号は 0 固定となります。
別のスクリプトをインクルードする（WSFファイル）
<job>
<script language="vbscript" src="lib.vbs"/>
<script language="vbscript">
SubA
</script>
</job>
Sub SubA
WScript.Echo "SubA"
End Sub
main.wsf
lib.vbs
main.wsf を実行すると、lib.vbs の SubA を呼び出します。
lib.vbs でエラーが発生すると、main.wsf でエラーが発生したようにエラーが出てしまいます。
エラーメッセージの行番号は、lib.vbs の行番号を表していることがあります。
スクリプト内から、インクルードするファイルを指定することはできません。
（XML部分に静的に書く必要があります）
プロシージャの中で Execute すると、グローバル変数ではなくなります。
関数は定義されます。 すでに定義されている関数は上書きされます。
クラスも定義されます。 すでに定義されているクラスがあるとエラーになります。
（クラスは、インスタンスに影響するため上書きできません）
Execute や、script src タグで WSF ファイルをインクルードすることはできません。
→ include (vbslib)
Execute で定義した関数は、関数の直下から呼び出すときしか使えません。
他の関数から呼び出すときに使えるようにしたいときは、ExecuteGlobal で定義してください。
JScript では、
(cache)
→ Vector：ExecuteGlobal.JS (Web)
関連
参考
→ CalculateVariables (vbslib)
→ Eval
← ▼ ▲
別のスクリプトをインクルードする（WSCファイル）
Windows Script Component(*.wsc) ファイルに記述されたスクリプトは、COM オブジェクトになれます。
COM オブジェクトなので、VBScript や JScript などから呼び出すことができます。
WSC ファイルには、VBScript と JScript を混在させることができます。
WSC ファイルによるCOM オブジェクトのホストは、Scrobj.dll です。
→ スクリプト コンポーネント チュートリアル - MSDN (Web)
→ ＠IT：Windows TIPS -- Tips：よく利用するジョブをスクリプトレットでコンポーネント化する (Web)
参考
*.wsc ファイルの中では、WScript オブジェクトは、あらかじめ用意されていません。
グローバル変数 g_Name は、GetObject で取得した複数のオブジェクトのそれぞれに、異なる変数領域
を持ちます。
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set obj = GetObject( "Script:"+ g_fs.GetAbsolutePathName( "ClassA.wsc" ) )
obj.MethodByJS WScript, "ABC"
WScript.Echo obj.Name
*.wsc を使うサンプル：
<?xml version="1.0"?>
<?component error="true" debug="false"?>
<component>
<public>
<method name="MethodByJS"><PARAMETER name="Param1"/><PARAMETER name="Param2"/></method>
<property name="Name" internalName="g_Name"/>
<property name="Prop2"><get internalName="GetProp2"/><put internalName="PutProp2"/></property>
<event name="namechanged"/>
</public>
<script language="JScript"><![CDATA[
var g_Name = "ABC";
function MethodByJS( Param1, Param2 )
{
Param1.Echo( "MethodByVBS "+ Param2 );
}
]]></script>
</component>
*.wsc ファイルのサンプル：
(Web)
→ wsc_sample.zip
WSC ファイルの中をデバッグするときは、?component debug を true にしてください。
← ▼ ▲
環境変数を取得する
Set g_sh = CreateObject( "WScript.Shell" )
root = g_sh.ExpandEnvironmentStrings( "%windir%\System" )
windir が定義されていないときは、%windir% のままになります
→ env (vbslib)
→ Environment (Shell)
関連
→ ExpandEnvironmentStrings (Shell)
← ▼ ▲
タスク （Windows でのスケジュール実行）
→ 新しくスケジュールを作成する (Windows XP)
Windows は、定期的に任意のバッチ処理を実行するようにスケジュールすることができます。
指定の日時に一度だけ行ったり、定期的に何度も行ったりできます。
スリープやログオフしていても開始可能です。
実行するユーザがログオンしていないと、ウィンドウは表示されません。（ユーザの切り替えで
裏で動いているときは表示されます）
特定の処理が終わってから、次の処理をすぐに実行するときは、バッチファイルなどで制御します。
・
・
・
・
バッチファイルなどから実行できることを確認してから、タスクを作成してください。
処理を行うプログラムが、バッチファイルなどから処理を開始できるようになっている必要があります。
別のユーザがログオン中でも正しく動作するには、プログラムの終了まで、実行する必要があります。
できること
設定方法
→ 新しくスケジュールを作成する (Windows Vista/7)
サンプル
→ TaskScheduler フォルダー (vbslib)
← ▼ ▲
新しくスケジュールを作成する (Windows XP)
[ コントロール パネル | タスク ］ で [ タスクの追加 ] をダブルクリックします。
[ 参照 ] で、処理内容を示す、バッチファイルやスクリプトファイルなどを指定します。
毎日、平日、n日間隔
期間の単位を指定します。 （この次で、時刻や曜日などを指定します）
曜日指定、n週間隔
毎月n日、第n m曜日
時計がついたアイコンが、タスクに追加されます。
アイコンを右クリックし [ プロパティ ] で、さらに詳細を設定できます。
プログラムを実行するユーザを指定します。
特定のユーザでしか処理ができないということでなければ、
普段使っているユーザで構いません。
処理を実行するバッチファイルやスクリプトファイルをあらかじめ作っておきます。
指定した時間になると、ダブルクリックしたときと同じ動きをします。
新規タスク・ウィザードは、次の設定を行います。
処理を実行するバッチファイルなど
実行する間隔（1回だけも可能）
開始時刻
実行するユーザ（通常は、普段使っているユーザでよい）
・
・
・
・
スリープ状態やバッテリー状態でも実行するときは、「電源の管理」の設定が必要です。
一覧には、ユーザ本人が作成したタスクしか表示されませんが、
ログオフ状態のユーザが作成したタスクも実行されます。
自分でも
パスワードの
入力が必要です
パラメータの指定は、ウィザードでは行えません。[ プロパティ ] で設定してください。
[ タスク ] タブ
[ 設定 ] タブ
← ▼ ▲
新しくスケジュールを作成する (Windows Vista/7)
Windows7 のタスクが起動する条件（時刻など）になったとき、PC がスリープ状態なら、
スリープから復帰した直後にタスクが起動します。
タスクの [ 条件 | タスクを実行するためにスリープを解除する] にチェック入れてあれば、
30秒前に Sleep 状態から復帰して、タスクが実行できます。
『半スリープ状態への入り方』
スリープ状態のときに、StationTV（地デジ・アプリ） の録画時間の 5分前になると、半スリープ状態に
なります。 予約録画中にスリープに入っても、半スリープ状態になります。
半スリープ状態では、画面は省電力モードになりますが、CPU などは通常通り動きます。
このため、地デジの録画ができます。
StationTV [ 共通設定 | 予約録画終了後処理 ] を [ 待機モード ] にすると、録画が終了したら、
画面が表示された状態での半スリープ状態になります。
『半スリープ状態の特徴』
CPU などは通常通り動きます。
音声出力は、ミュート（無音）になります。
SetSuspendState を呼び出しても、スリープに入りません。
shutdown コマンドによる PowerOff はできます。
『半スリープ状態からの復帰』
半スリープ状態から通常状態に復帰するには、マウスを動かすなどの操作をします。
自動的に復帰させようと、SetCursorPos Win32 API を使ってカーソルを動かしても、復帰しません。
自動的に半スリープ状態から復帰するには、スクリーンセーバーを起動します。 Windows の設定で、
スクリーンセーバーの起動時間を設定してください。 ただし、WSH で任意のプロセスを起動すると、
スクリーンセーバーが起動するまでの時間を測っているタイマーがリセットされるので注意してください。
また、scr ファイルを直接起動した場合は、半スリープ状態から復帰しません。
半スリープ状態（Windows7）
タスクが起動する条件になったときに、PC がスリープ状態のとき
半スリープ状態では、半スリープ状態のまま、タスクが起動できます。
ただし、Sleep 状態から通常状態に復帰しません。
処理を実行するバッチファイルやスクリプトファイルをあらかじめ作っておきます。
指定した時間になると、ダブルクリックしたときと同じ動きをします。
スタート・メニューから、「タスク・スケジューラ」 を検索して起動します。
右のペインから、「タスクの作成」 を押します。
[ トリガー ] に開始時刻やイベントを入力します。
[ 操作 ] に、実行するコマンドを入力します。
タスクの一覧 （ダブルクリックで編集開始）
はじめに
ここをクリック
選択中のタスクの内容（編集はできません）
新規作成
半スリープ状態は、Windowsの用語ではありません
← ▼ ▲
標準入出力、リダイレクト、エラーレベル
＠IT：WshShellオブジェクトの詳細（1）
ex.StdIn, ex.StdOut, ex.StdErr
Set g_sh = WScript.CreateObject( "WScript.Shell" )
Set ex = g_sh.Exec( "ipconfig.exe" ) ' ipconfig を実行 *******
Do While ex.Status = 0 : WScript.Sleep 100 : Loop
Do Until ex.StdOut.AtEndOfStream : WScript.Echo ex.StdOut.ReadLine() : Loop
Do Until ex.StdErr.AtEndOfStream : WScript.Echo ex.StdErr.ReadLine() : Loop
ex.ExitCode
ex = Empty
Dim ex, f
Set g_sh = WScript.CreateObject( "WScript.Shell" )
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set ex = g_sh.Exec( "ipconfig" )
Do While ex.Status = 0 : WScript.Sleep 100 : Loop
Set f = g_fs.OpenTextFile( "C:\result.txt", 8, True, False ) '// 8=append
Do Until ex.StdOut.AtEndOfStream : f.WriteLine ex.StdOut.ReadLine() : Loop
Do Until ex.StdErr.AtEndOfStream : f.WriteLine ex.StdErr.ReadLine() : Loop
ex = Empty
f = Empty
ex.Status ' 0=実行中, 1=終了
ex.ExitCode ' 終了コード（返り値）
WScript.StdErr.Write "pass" & vbCR & vbLF
→ Exec メソッド (Web)
ファイルに追記出力する
Set g_sh = WScript.CreateObject( "WScript.Shell" )
Set ex = g_sh.Exec( "ipconfig.exe" ) ' ipconfig を実行 *******
Do While ex.Status = 0 : WScript.Sleep 100 : Loop
text = ex.StdOut.ReadAll()
ex = Empty
← ▼ ▲
ファイル操作
→ ファイルをコピーする
→ フォルダをコピーする
→ 新しいファイルのみコピーする
→ ファイルの存在
→ ファイル一覧
→ サブフォルダ一覧 （１段下のみ）
→ サブフォルダ一覧 （再帰、ネスト）
→ ファイル名を変える
→ ファイル内アクセス（テキスト）
→ CreateFolder
→ DeleteFolderR
→ テキストファイルを結合する
→ ファイル名、パス
→ FileSystemObject
→ File オブジェクト
→ ファイルの属性や更新日時
→ カレント・ディレクトリ
→ 存在しないファイルを開く
→ 特殊フォルダ
→ 指定した行へ移動する
→ VBSファイルにドラッグ＆ドロップ
→ ショートカットを作成する
← ▼ ▲
ファイル名、パス
ファイルの名前を変える
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.GetFile( "c:\a.txt" )
f.Name = "b.ini"
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
s = g_fs.GetParentFolderName( "c:\sub1\sub2\file.txt" ) ' s="c:\sub1\sub2"
s = g_fs.GetFileName( "c:\sub1\file.txt" ) ' s="file.txt"
s = g_fs.GetDriveName( "c:\sub1\file.txt" ) ' s="c:"
s = g_fs.GetBaseName( "c:\sub1\file.txt" ) ' s="file"
s = g_fs.GetExtensionName( "c:\sub1\file.txt" ) ' s="txt"
s = g_fs.BuildPath( "c:\sub1", "file.txt" ) ' s="c:\sub1\file.txt"
ファイルパス文字列の操作関数
C:\a.txt をb.ini に変えています。
フル・パスにする、GetAbsolutePathName
カレントフォルダを基準に、相対パスをフル・パスにします。
実際にファイルが存在しなくても正しく操作されます。
ワイルドカードを展開する
→ ExpandWildcard (VBSLib)
フル・パス = g_fs.GetAbsolutePathName( 相対パス )
GetFileName
GetParentFolderName
g_fs.GetAbsolutePathName( フル・パス + "\.." ) とすると、親フォルダの
フル・パスになります。
g_fs.GetAbsolutePathName( "C:\folder\..\a.txt" ) は、"C:\folder\..\a.txt"
のままです。
g_fs.GetAbsolutePathName( "C:\folder\*" ) は、"C:\folder\." になります。
拡張子を変えたパスを取得する
存在するファイルの名前を変えます。
→ ファイルパス文字列の操作関数
→ 拡張子を変えたパスを取得する
→ フルパスにする
→ ワイルドカードを展開する
→ ファイルの名前を変える
s = g_fs.GetParentFolderName( s ) + "\" + g_fs.GetBaseName( s ) + ".csv"
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.GetFolder( "c:\folderA" )
f.Name = "folder1"
C:\folderA をfolder1 に変えています。
存在するフォルダの名前を変えます。
変えようとする名前のファイルが既にあるときは、エラーになります。
パスの記述方法、相対パス、フル・パス、カレントフォルダー
→ パスの記述方法、相対パス、フル・パス、カレントフォルダー
C:\Users\user1\Documents\sample.txt
ファイルやフォルダの場所を示すアドレスのことを特に、「パス」と言います。
C:\Users\user1\Documents\sample.txt
例：
上記は、Windows 7 における、「ドキュメント」フォルダにある sample.txt ファイルの
フル・パスです。 C:\ から始まるものを
フォルダ（エクスプローラー）の「アドレス」に書かれています。
\ または / は、Windows におけるフォルダーの区切りを示します。
C: は、コンピューターの C ドライブを表しており、通常、PC に入っている
ハードディスクになります。 USB メモリを挿すと、E ドライブなどができます。
一般にスクリプトには、
相対パスは、
カレントフォルダー
相対パス
フル・パス
C:\Folder1
C:\Folder1\File1.txt
File1.txt
C:\Folder1
sub\File1.txt
C:\Folder1\sub\File1.txt
C:\Folder1\File1.txt
.\File1.txt
C:\Folder1
..\File1.txt
C:\File1.txt
C:\Folder1
環境変数を含むパスは、
WScript.Shell.ExpandEnvironmentStrings
または、
env (vbslib)
で展開できます。
C:\File1.txt
..\..\File1.txt
C:\Folder1\sub
Shell::CurrentDirectory
や
は、通常、起動したスクリプト・ファイル（.vbs）があるフォルダーになります。
キーワード：
GetBaseName, GetExtensionName
インターネットにあるファイルの場所を示すアドレスは、URL または URI と言います。
インターネットやLANのアドレス
→ インターネットやLANのアドレス
と言います。
フル・パス
か、環境変数を含んだパスを記述します。
相対パス
を基準としたパスです。 カレントフォルダーは、
カレント・フォルダー
で、設定や参照ができますが、スクリプト起動直後
cd
相対パスに記述する . （ピリオド）は、カレントフォルダー、 .. （ピリオド２つ）は、
親フォルダーを表します。
URL は、ファイル操作などの関数に指定することはできません。
LAN （家庭内、社内ネットワーク）にあるファイル（\\ で始まるアドレス、UNC）は、
copy 関数などに指定できます。 ただし、カレント・フォルダー（後述）に指定する
ことはできません。
DownloadByHttp (vbslib)
などを使ってダウンロードしてください。
例：
http://www.sage-p.com/vbslib/vbslib.htm
参考
→ GetPercentURL
UNC
→ UNC：Universal Naming Convention
参考
←
↓