SQLの窓

2021年01月19日


VBScript : Cscript.exe で実行を強制する為の関数( Function Crun ) : Wscript.Echo で止まらないように

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 オブジェクト のプロパティ
タグ:VBScript WSH
posted by lightbox at 2021-01-19 00:14 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする

2018年02月12日


VBScript : WSH : 雛型(テンプレート)

VBScript をアプリケーションとして実行する為の使い方です。拡張子は .wsf として下さい

※ REFERENCE 要素でオブジェクトに定義されている定数を参照可能にしています。
※ RESOURCE 要素でソース内にテキストを定義できます
※ SCRIPT 要素を使用すると、URL を指定して外部ライブラリを読み込む事ができます
※ JavaScript のライブラリを読み込んで、呼び出す事も可能です



<JOB>
<COMMENT>
************************************************************
■著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。
************************************************************
</COMMENT>

<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
<OBJECT id="Dic" progid="Scripting.Dictionary" />
<OBJECT id="Shell" progid="Shell.Application" />

<OBJECT id="Cn" progid="ADODB.Connection" />
<OBJECT id="Rs" progid="ADODB.Recordset" />
<OBJECT id="Stream" progid="ADODB.Stream" />
<OBJECT id="Adox" progid="ADOX.Catalog" />

<REFERENCE object="ADODB.Connection" />

<SCRIPT language=VBScript>
Crun()

' ***********************************************************
' 処理開始
' ***********************************************************
' REFERENCE 要素定義の為可能な定数参照
Wscript.Echo "adUseNone = " & adUseNone
Wscript.Echo "adUseServer = " & adUseServer
Wscript.Echo "adUseClient = " & adUseClient
Wscript.Echo "adUseClientBatch = " & adUseClientBatch

' ソース内テキストデータの表示
Wscript.Echo RegTrim(GetResource("myTextData"))

' GUI 
if vbCancel = MsgBox( "処理が終了しました   ", vbOKCancel , "サンプル" ) then
	Wscript.Echo "キャンセルされました"
end if

' ***********************************************************
' 文字列前後の漢字スペースを含むホワイトスペースの削除
' ***********************************************************
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
' **********************************************************
' Cscript.exe で実行を強制
' Cscript.exe の実行終了後 pause で一時停止
' **********************************************************
Function Crun( )

	Dim str,WshShell

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	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
		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

</SCRIPT>

<COMMENT>
************************************************************
 ソース内テキストデータ
************************************************************
</COMMENT>
<RESOURCE id="myTextData">
<![CDATA[
Hello World!!
]]>
</RESOURCE>

</JOB>


Microsoft でADOの定数の値を確認

ADO Enumerated Constants : CursorLocationEnum



タグ:VBScript
posted by lightbox at 2018-02-12 00:34 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする

VBScript : コンピュータ名の取得

WshNetwork

WshNetwork オブジェクト
Set objNetwork = CreateObject("WScript.Network")
Wscript.Echo objNetwork.ComputerName
Wscript.Echo objNetwork.UserName
Wscript.Echo objNetwork.UserDomain

WMI

Hey, Scripting Guy! 
WMI を使用してローカル コンピュータの名前を判別する方法はありますか

Win32_ComputerSystem class

以下は、Win32_ComputerSystem で取得できる string を表示したものです。(cscript.exe の実行を強制して、コマンドプロンプトで表示しています)
Crun()

strComputer = "."  

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")  
	
For Each objItem in colItems

	Wscript.Echo objItem.Name  
	Wscript.Echo objItem.Domain  
	Wscript.Echo objItem.PrimaryOwnerName

	Wscript.Echo objItem.BootupState
	Wscript.Echo objItem.Caption
	Wscript.Echo objItem.ChassisSKUNumber
	Wscript.Echo objItem.CreationClassName
	Wscript.Echo objItem.Description
	Wscript.Echo objItem.DNSHostName
	Wscript.Echo objItem.LastLoadInfo
	Wscript.Echo objItem.Manufacturer
	Wscript.Echo objItem.Model
	Wscript.Echo objItem.NameFormat
	Wscript.Echo objItem.PrimaryOwnerContact
	Wscript.Echo objItem.Status
	Wscript.Echo objItem.SystemFamily
	Wscript.Echo objItem.SystemSKUNumber
	Wscript.Echo objItem.SystemType
	Wscript.Echo objItem.UserName
	Wscript.Echo objItem.Workgroup

Next 

' **********************************************************
' Cscript.exe で実行を強制
' Cscript.exe の実行終了後 pause で一時停止
' **********************************************************
Function Crun( )

	Dim str,WshShell

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	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
		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




posted by lightbox at 2018-02-12 00:15 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする

VBScript : クリップボードデータの取得


Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
Do While objIE.Busy
	' 100 ミリ秒
	Wscript.Sleep 100
Loop
strText = objIE.document.parentWindow.clipboardData.GetData( "Text" ) & ""
objIE.Quit

Wscript.Echo strText

InternetExplorer を使うので、セキュリティ設定でクリップボードの扱いが制限されている場合があります



デフォルトではダイアログボックスが表示されて、貼り付けても良いか(またはコピーしても良いか)確認を要求されます。



『アクセスを許可する』をクリックすると、クリップボードからデータを取得します。このダイアログを表示したく無い場合は、セキュリティ設定で『有効にする』と設定して保存して下さい。

うまく動作させる為の重要なポイント

about:blank の場合、Busy プロパティは殆ど必要無いはずですが、実際のページの場合は Busy プロパティのチェックが必要なので、普段から、このように書いておいたほうが良いでしょう
※ ReadyState の 4( 完了 ) をチェックしている方も居られるようです  



タグ:VBScript
posted by lightbox at 2018-02-12 00:14 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする

2018年02月10日


VBScript : InternetExplorer.Application で、ファイルを開くダイアログを開く

管理者権限で実行する必要がある

昔から一般的に使われて来た方法ですが、ある時から about:blank では、fakepath というパスで返るようになって使えなくなっていました。そこで、ローカルにファイルを作ってそれで対処しています。但し、管理者権限で実行する必要があるので冒頭の処理が必要です。

簡易的なファイルを開く

ファイルの種類は設定できません。どうしても VBScript でファイルを開く為のダイアログを正しく使いたい場合は、COM を作成して呼び出す必要があります( exe に実行させて、ファイルで引き渡すと言う手もあります )。しかし、本来 VBScript で行う処理は簡易的なものなのでそこまでこだわる必要も無いのでこれで十分使えると思います。 冒頭の objShell.MinimizeAll は実行しておかないと、エクスプローラから実行した場合その下にファイルを開くダイアログが隠れてしまいます。 このソースは拡張子が .wsf 用です。
<JOB>
<SCRIPT language="VBScript">
' ************************************************
' 管理者として実行を強制する
' ************************************************
Set objShell = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	objShell.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

' ************************************************
' ファイルを開くダイアログの為に他を全て最小化する
' ************************************************
objShell.MinimizeAll

' ************************************************
' ファイル選択
' ************************************************
strValue = OpenLocalFileName
if strValue = "" then
	Wscript.Quit
end if

MsgBox( strValue )

' ************************************************
' InternetExplorer.Application でファイル選択
' ************************************************
Function OpenLocalFileName( )

	' ファイルシステムを操作するオブジェクト
	Set Fso = WScript.CreateObject( "Scripting.FileSystemObject" )
	' テンポラリフォルダ
	TempDir =  Fso.GetSpecialFolder(2)
	on error resume next
	' テンポラリフォルダに空の "local.htm" を作成
	Set objHandle = Fso.CreateTextFile( TempDir & "\local.htm", True, True )
	if Err.Number <> 0 then
		Exit Function
	end if
	objHandle.Close
	on error goto 0

	Set IEDocument = Wscript.CreateObject("InternetExplorer.Application")
	IEDocument.Navigate( TempDir & "\local.htm" )
	Do While IEDocument.Busy
		' 100 ミリ秒
		Wscript.Sleep 100
	Loop
	IEDocument.document.getElementsByTagName("BODY")(0).innerHTML = "<input id='FilePath' type='file'>"
	call IEDocument.document.getElementById("FilePath").click()
	if IEDocument.document.getElementById("FilePath").value = "" then
		OpenLocalFileName = ""
		IEDocument.Quit
		Set IEDocument = Nothing
		Exit Function
	end if

	OpenLocalFileName = IEDocument.document.getElementById("FilePath").value

	IEDocument.Quit
	Set IEDocument = Nothing

End Function
</SCRIPT>
</JOB>




posted by lightbox at 2018-02-10 20:45 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする

2018年02月03日


VBScriptで、ビットをスイッチとして使う記述

C言語と同じです。
| に相当する or を使用したり、& に相当する and を使用してビット演算が可能です

Or 演算子は、2 つの数式内の対応するビットに対するビット単位の比較も行います。
And 演算子は、2 つの数式内の対応するビットに対するビット単位の比較も行います
Xor 演算子は、2 つの数式内の対応するビットに対するビット単位の比較も行います。
Not 演算子は、変数に対してビット単位の反転も行います。

' 00000001	スイッチA
' &H1
' 00000010	スイッチB
' &H2
' 00000100	スイッチC
' &H4
' 00001000	スイッチD
' &H8

' スイッチA と スイッチ C をオンにする

flag = &H1 or &H4 ' ( つまり、&H5 )

' それぞれのスイッチがオンの時にメッセージを表示

if ( flag and &H1 ) = &H1 then
	Wscript.Echo "スイッチA"
end if
if ( flag and &H2 ) = &H2 then
	Wscript.Echo "スイッチB"
end if
if ( flag and &H4 ) = &H4 then
	Wscript.Echo "スイッチC"
end if
if ( flag and &H8 ) = &H8 then
	Wscript.Echo "スイッチD"
end if


※ 初期投稿 : 2009-07-03


posted by lightbox at 2018-02-03 17:49 | VBScript ベーシック | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり