Wscript.Echo で止めない為に
WSH のテストをする場合エクスプローラからの起動が便利なわけですが、GUI を使用するとどうしても Wscript.exe が起動されて、デバッグの為に表示している Wscript.Echo が 実行毎にダイアログ表示になってしまいます。
これでは、ループ内で処理している場合等は悲惨な事になります。
そうならない為の関数です。
スクリプト自身から再度 Cscript.exe で実行させる
具体的には Cscript.exe で実行して無かった場合にコマンドプロンプトを開いて、そこから Cscript.exe で自分自身を実行させて、終了したら PAUSE します。( Wscript で実行されたスクリプトは終了させます )
※ スクリプトへの引数は引継ぎます
サンプルコード( .vbs )
▼ 以下のコードでは、Crun 関数がその部分ですが、それを利用して『デスクトップのショートカットのアイコン情報』の一覧を表示しています。
Call Crun()
Set Shell = WScript.CreateObject( "Shell.Application" )
Set WshShell = WScript.CreateObject( "WScript.Shell" )
' デスクトップ
Set objFolder = Shell.NameSpace( 0 )
Set objFolderItems = objFolder.Items()
' 一覧の数
nCount = objFolderItems.Count
' デスクトップ一覧の列挙
For i = 0 to nCount - 1
strPath = objFolderItems.Item(i).Path
' パスをピリオドで分解
aData = Split( strPath, "." )
' 配列の上限値より、一番右端にある拡張子を取得
strTarget = aData( Ubound( aData ) )
' 大文字に変換
strTarget = Ucase( strTarget )
' デスクトップのショートカットのアイコン情報を取得
if strTarget = "LNK" then
' ショートカットへのオブジェクト( 保存はしない )
Set oShellLink = WshShell.CreateShortcut(strPath)
strTarget = oShellLink.IconLocation
' %変数名% で参照される環境変数を展開する
strTarget = WshShell.ExpandEnvironmentStrings(strTarget)
if strTarget = ",0" then
' アイコンは、TargetPath の 0 番目のアイコンを使用
Wscript.Echo oShellLink.TargetPath
else
' アイコンは、strTarget を , で分解して抽出
Wscript.Echo strTarget
end if
end if
Next
' **********************************************************
' Cscript.exe で実行を強制
' Cscript.exe の実行終了後 pause で一時停止
' **********************************************************
Function Crun( )
Dim str,WshShell
' 実行中の WSH のフルパス
str = WScript.FullName
' 右から11文字取得
str = Right( str, 11 )
' 全て大文字に変更
str = Ucase( str )
' CSCRIPT.EXE でなければ処理を行う
if str <> "CSCRIPT.EXE" then
' 実行中の自分自身(スクリプト)のフルパスを取得
str = WScript.ScriptFullName
Set WshShell = CreateObject( "WScript.Shell" )
' 実行中の自分自身(スクリプト)への引数を引き継ぐ為の文字列を作成
strParam = " "
For I = 0 to Wscript.Arguments.Count - 1
if instr(Wscript.Arguments(I), " ") < 1 then
strParam = strParam & Wscript.Arguments(I) & " "
else
strParam = strParam & Dd(Wscript.Arguments(I)) & " "
end if
Next
' cscript.exe で実行しなおす為のコマンドラインを実行
Call WshShell.Run( "cmd.exe /c cscript.exe " & Dd(str) & strParam & " & pause", 1 )
' 実行中の自分自身(スクリプト)を終了
WScript.Quit
end if
End Function
' **********************************************************
' 文字列を " で囲む関数
' **********************************************************
Function Dd( strValue )
Dd = """" & strValue & """"
End function
Microsoft のドキュメント
Shell.NameSpace method
ShellSpecialFolderConstants(0はデスクトップ)
Folder.Items method
CreateShortcut メソッド
ExpandEnvironmentStrings メソッド
WshShortcut オブジェクト のプロパティ