SQLの窓 イラストAC フリー素材

2014年08月30日

Access.Application ( docmd.TransferText ) でエクスポートとインポート

ドキュメントを読むと、余計わかりにくくなりますが、2番目の引数は省略できます(デフォルトのインポート/エクスポートの仕様を選択する場合は、この引数を空白のままにすることができます)。

一番の問題は、.vbs 内で定義されていない定数を使う事で、.wsf で定数をインポートする場合は別ですが、.vbs では定数をあらかじめ定義しておく必要があります。

AcTextTransferType Enumeration
Const acExportDelim 	= 2	'Export Delimited
Const acExportFixed	= 3	'Export Fixed Width
Const acExportHTML	= 8	'Export HTML
Const acExportMerge	= 4	'Export Microsot Word Merge
Const acImportDelim	= 0	'Import Delimited
Const acImportFixed	= 1	'Import Fixed Width
Const acImportHTML	= 7	'Import HTML
Const acLinkDelim	= 5	'Link Delimited
Const acLinkFixed	= 6	'Link Fixed Width
Const acLinkHTML	= 9	'Link HTML

Set ac = Wscript.CreateObject("Access.Application") 
ac.OpenCurrentDatabase("C:\vbs\mdb\a2010.accdb") 

ac.docmd.TransferText acExportDelim, "", "社員マスタ", "C:\vbs\mdb\doexp.csv", true

ac.docmd.TransferText acImportDelim, "", "社員マスタ", "C:\vbs\mdb\社員マスタ.csv", true

ac.docmd.Closedatabase

最後の true は、一行目がフィールド名である事を示しています

※ このインポート処理では、キーが重複しないもののみインポートされます


posted by at 2014-08-30 12:14 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年08月26日

VBScript でエクスプローラの再起動

WMI に関しては決まり文句です。GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 以外を使用する事は少ないです。『.』は、自分が実行しているコンピュータですが、違った書き方では、他の PC にログインしてリモートで WMI を実行できます。

For Each objProcess in colProcessList も決まり文句で、目的が一つしか無い事が通常ですが、For Each 内で対象の処理を行う事がほとんどです。

エクスプーラを、Terminate しても実行中のアプリは現状維持するようです。エクスプローラが本体として動作しているフォルダや管理ウインドウはいったん閉じてまたデフォルトの状態で開くようですが細かく確認はしていません。
' 起動用
Set WshShell = Wscript.CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' いったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'explorer.exe'") 
For Each objProcess in colProcessList
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

' 少し待ちます
Wscript.Sleep(500)
Call WshShell.Run( "explorer.exe" )






タグ:VBScript WMI
posted by at 2014-08-26 22:07 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年07月05日

VBScript : 現在のUnixタイムスタンプを求める

PHP で、mktime は、『日付を Unix のタイムスタンプとして取得する』関数です。返される値の意味は、『Unix epoch(1970年1月1日00:00:00 GMT)から 指定された時刻までの通算秒を表す長整数』です

タイムゾーンは、"Asia/Tokyo" で設定しています。
<?php
// 1404658800

date_default_timezone_set( "Asia/Tokyo" );
print mktime(0,0,0,7,7,2014);


?>
VBScript で、DateDiff は、『指定された 2 つの日付の時間間隔を返す』関数です。また、DateAdd は、『指定された時間間隔を加算した日付を返す』関数です

DateDiff の最初の引数の "s" は、秒を表し、1970/1/1 0:00:00 からの経過秒数を求める事によって、Unixタイムスタンプの仕様に合致させています。DateAdd の "h" も同様(この場合は1時間)ですが、-9 は、タイムゾーンの調整です("Asia/Tokyo")
' 1404658800
Wscript.Echo DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,"2014/07/07"))

当時(2010-05-27)、こんな事やっていた目的ですが・・・

VBScript で Twitter API を呼び出す準備の一つで、nonce 関数は以下のようになります。
Function Nonce(  )

	Dim base_str,str,I,nLen,Random
	base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

	nLen = Len(base_str)

	str = ""
	For I = 1 to 32
		Randomize
		Random = 1 + Int(Rnd * nLen)
		str = str & Mid(base_str,Random,1)
	Next

	Nonce = str

End function
Base64 を含む、Twitter の処理は、crypto-js が優れています。実際に利用したコードを以下のリンク先からダウンロードできます。

WSH : VBScript と JavaScript で Twitter に投稿する


以下は単純な Base64 の処理に適しています

Bsee64 は、以下を参照して下さい
VBScript : Base64 エンコード( UTF-8 )


タグ:VBScript twitter
posted by at 2014-07-05 13:17 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年05月27日

カレントディレクトリを AnHttpd の Alias として登録する

以前 HTA で作成していましたが、管理者権限等の関係で使いづらくなっていたので、単純な VBScript に変更しました。


Set Shell = CreateObject("Shell.Application")
if WScript.Arguments.Count = 0 then
	Shell.ShellExecute "cmd.exe", "/c Cscript.exe """ & Wscript.ScriptFullName & """ dummy & pause", "", "runas", 1
	Wscript.Quit
end if

Set WshShell = CreateObject("WScript.Shell")
Set Fso = CreateObject("Scripting.FileSystemObject")

Set objBasic = new basic : objBasic
Set objWmireg = new wmireg : objWmireg

Call SetAlias()

Function SetAlias( )

' ***********************************************************
' 処理開始
' ***********************************************************
	' 対象のレジストリを決定
	strTarget = "default"
	strTarget = "SOFTWARE\AnHttpd\" & strTarget & "\Alias"
	' 仮想ディレクトリの一覧を取得する
	Set var = objWmireg.GetLValueArray( strTarget )
	
	' 仮想ディレクトリ名を決定
	strAlias = " /" & objBasic.var("ScriptCurDirName")

' ***********************************************************
' 既にあれば上書き、無ければ追加
' ***********************************************************
	if not var.Exists( strAlias ) then
		nValue = var("Count") + 1
		objWmireg.SetLDword strTarget, "Count", nValue
	end if
	' 物理ディレクトリは、このスクリプトのあるパス
	objWmireg.SetLString strTarget, strAlias, objBasic.var("ScriptCurDir") 


	Wscript.Echo objBasic.var("ScriptCurDir") & vbCrLf & " を AnHttpd の一般パスのエイリアスとして登録しました" & vbCrLf

End Function

Class basic

Public var
Public objWMIService
 
' ************************************************
' コンストラクタ
' ************************************************
Public Default Function InitSetting()

	Dim obj,objOS

	Set var = CreateObject( "Scripting.Dictionary" )

	' スクリプトが存在するディレクトリ(WSH用)
	on error resume next
	ScriptCurDir = WScript.ScriptFullName
	Set obj = Fso.GetFile( ScriptCurDir )
	Set obj = obj.ParentFolder
	var("ScriptCurDir") = obj.Path
	Set obj = Fso.GetFolder( var("ScriptCurDir") )
	var("ScriptCurDirName") = obj.Name
	on error goto 0

	Set objWMIService = GetObject("winmgmts:" _
	 & "{impersonationLevel=impersonate}!\\.\root\cimv2")

	Set obj = objWMIService.ExecQuery( _
		"Select * from Win32_OperatingSystem")
	on error resume next
	For Each objOS in obj
		var("OsName") = objOS.Caption
		var("ComputerName") = objOS.CSName
		var("ServicePack") = objOS.ServicePackMajorVersion _
		& "." & objOS.ServicePackMinorVersion
		var("WinDir") = objOS.WindowsDirectory
		var("SysDir") = objOS.SystemDirectory
	Next
	on error goto 0

end function

' ************************************************
' 環境文字列の一覧の取得
' ************************************************
Function GetAllValue()

	Dim str,key

	str = ""

	For Each key in var
		str = str & key & " = " & var(key) & vbCrLf
	Next

	GetAllValue = str

end function
 
' ************************************************
' 非同期実行
' ************************************************
Function RunASync( strPath )

	Call WshShell.Run( strPath )

end function

' ************************************************
' 同期実行
' ************************************************
Function RunSync( strPath )

	Call WshShell.Run( strPath, , True )

end function

' ************************************************
' コマンドプロンプト同期実行( プロンプトを開く )
' cmd.exe /c 以降を指定
' ************************************************
Function CmdSyncWithConsole( strPath, bPause )

	if bPause then
		Call WshShell.Run( _
		"cmd.exe /c " & strPath & " & pause", , True )
	else
		Call WshShell.Run( _
		"cmd.exe /c " & strPath, , True )
	end if

end function

' ************************************************
' コマンドプロンプト同期実行( プロンプトを開かない )
' cmd.exe /c 以降を指定
' ************************************************
Function CmdSyncWithoutConsole( strPath )

	Call WshShell.Run( _
		"cmd.exe /c " & strPath, 0, True )

end function

End Class

const WMI_HKEY_LOCAL_MACHINE = &H80000002
const WMI_REG_SZ = 1 
const WMI_REG_EXPAND_SZ = 2 
const WMI_REG_BINARY = 3 
const WMI_REG_DWORD = 4 
const WMI_REG_MULTI_SZ = 7 

Class wmireg

Public objReg 
 
' ************************************************
' コンストラクタ
' ************************************************
Public Default Function InitSetting()
 
	Set objReg = _
		GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
		".\root\default:StdRegProv") 
 
end function

' ************************************************
' サブキーの配列を取得
' ************************************************
Function GetLSubKeyArray( strPath )

	Dim aSubKeys,str

	objReg.EnumKey WMI_HKEY_LOCAL_MACHINE, strPath, aSubKeys
	GetLSubKeyArray = aSubKeys
 
end function

' ************************************************
' 値の一覧の連想配列を取得
' ************************************************
Function GetLValueArray( strPath )

	Dim aValueNames, aValueTypes, strValue, aValue

	Set var = CreateObject( "Scripting.Dictionary" )

	objReg.EnumValues WMI_HKEY_LOCAL_MACHINE, strPath,_ 
		aValueNames, aValueTypes 
	For i=0 To UBound(aValueNames)
		Select Case aValueTypes(i) 
			Case WMI_REG_SZ
				objReg.GetStringValue _
				WMI_HKEY_LOCAL_MACHINE,strPath,aValueNames(i),strValue
				var(aValueNames(i)) = strValue
			Case WMI_REG_EXPAND_SZ
				objReg.GetExpandedStringValue _
				WMI_HKEY_LOCAL_MACHINE,strPath,aValueNames(i),strValue
				var(aValueNames(i)) = strValue
			Case WMI_REG_DWORD
				objReg.GetDWORDValue _
				WMI_HKEY_LOCAL_MACHINE,strPath,aValueNames(i),strValue
				var(aValueNames(i)) = strValue
			Case WMI_REG_MULTI_SZ
				objReg.GetMultiStringValue _
				WMI_HKEY_LOCAL_MACHINE,strPath,aValueNames(i),aValue
				var(aValueNames(i)) = aValue
			Case WMI_REG_BINARY 
				objReg.GetBinaryValue _
				WMI_HKEY_LOCAL_MACHINE,strPath,aValueNames(i),aValue
				var(aValueNames(i)) = aValue
		End Select 
	Next 

	Set GetLValueArray = var

end function

' ************************************************
' 文字列セット
' ************************************************
Function SetLString( strPath, strName, strValue )

	objReg.SetStringValue _
		WMI_HKEY_LOCAL_MACHINE,strPath,strName,strValue 

end function

' ************************************************
' 整数セット
' ************************************************
Function SetLDword( strPath, strName, dwValue )

	objReg.SetDWORDValue _
		WMI_HKEY_LOCAL_MACHINE,strPath,strName,dwValue

end function

End Class




posted by at 2014-05-27 20:50 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年05月04日

VBScript : SQLExpress(SQLServer) に販売管理Bを作成する


VBScript : SQLExpress( SQLServer ) に 販売管理B を作成する


販売管理B.mdb は、SQL学習用として2005年9月に作成した MDB のテーブルとビューのセットです。SQLExpress と同じ Microsoft 純正ですので、インポートは高速で簡単に実行する事ができます。ただ、テーブルの定義が SQLExpress 依存になりますので、スクリプト内から新たに DDL を実行しています。

SQLの窓 Build C++ のスクリプトにも追加

SQLの窓 Build C++ のダウンロードページ


テーブル名 タイプ 作成 更新 件数   
1 V_商品一覧 VIEW 2005/09/13 1:50:36 2005/09/13 1:50:36 100
2 V_売上日付 VIEW 2005/09/13 1:50:36 2005/09/13 1:50:36 1
3 V_得意先台帳 VIEW 2005/09/13 1:50:36 2005/09/13 1:50:36 2463
4 V_社員一覧 VIEW 2005/09/13 1:50:36 2005/09/13 1:50:36 50
5 コード名称マスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 17
6 コントロールマスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 1
7 メッセージマスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 13
8 取引データ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 2463
9 商品マスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 100
10 商品分類マスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 29
11 得意先マスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 50
12 社員マスタ TABLE 2005/09/13 1:49:04 2005/09/13 1:49:04 50
13 郵便番号マスタ TABLE 2005/09/13 1:57:58 2005/09/13 1:57:58 3715



posted by at 2014-05-04 21:17 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年04月17日

VBScript : 拡張子との関連付けでアプリケーションを起動する

コマンドプロンプト内のコマンドの start コマンドを使用して、カレントディレクトリにあるファイルを実行します。但し、コマンドプロンプトが開かないように、WshShell.Run に第二引数を 0、第三引数を同期実行として true に設定しています。
Set WshShell = CreateObject( "WScript.Shell" )
Call WshShell.Run( "cmd.exe /c start " & "ProcessList.htm",0, true )

rundll32.exe shell32.dll,ShellExec_RunDLL を使用して拡張子と関連付けられたアプリケーションを使用します。但し、対象となるファイルが絶対パスである必要があるので、コマンドプロンプトの特性を利用してカレントディレクトリのパスを付加しています。
Set WshShell = CreateObject( "WScript.Shell" )
Call WshShell.Run( "cmd.exe /c rundll32.exe shell32.dll,ShellExec_RunDLL ""%CD%\ProcessList.htm""",0, true )

rundll32.exe shell32.dll,ShellExec_RunDLL を使用しています。一つ前と同じですが、絶対パスの付加方法として、FOR コマンドを利用しています。
Set WshShell = CreateObject( "WScript.Shell" )
Call WshShell.Run( "cmd.exe /c FOR /F %i IN ('ProcessList.htm') DO rundll32.exe shell32.dll,ShellExec_RunDLL ""%~fi""",0, true )

rundll32.exe shell32.dll,ShellExec_RunDLL を使用していますが、絶対パスを付加する為の情報を、VBScript 内で取得するので、実行時にコマンドプロンプトを使用していないので、WshShell.Run の引数はコマンドのみです。
Set WshShell = CreateObject( "WScript.Shell" )
Call WshShell.Run( "rundll32.exe shell32.dll,ShellExec_RunDLL " & """" & WshShell.CurrentDirectory & "\ProcessList.htm""" )





posted by at 2014-04-17 23:38 | VBScript | このブログの読者になる | 更新情報をチェックする

実行されたプログラムがどこにあって、どのように実行されているか

早い話、タスクマネージャに表示されている、より詳しい情報を取得です。パスが通ってるファイルを実行した時の実際の場所を知りたい時や、なんか、気になる(ウイルス?)プログラムの起動場所を知りたい時に使います


Set Fs = CreateObject( "Scripting.FileSystemObject" )
Set WshShell = CreateObject( "WScript.Shell" )
Set OutFile = Fs.OpenTextFile( "ProcessList.htm", 2, True )

strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set col = objWMIService.ExecQuery _ 
    ("Select * from Win32_Process") 
result = ""
OutFile.WriteLine "<html><head><title>ProcessList</title>"
OutFile.WriteLine "<meta http-equiv=""Content-Type"" content=""text/html; charset=shift_jis"">"
OutFile.WriteLine "<style type=""text/css"">* { font-size:12px;}"

str=""
str=str&"table { "&vbCrLf
str=str&"	border-collapse: collapse; "&vbCrLf
str=str&"	border-style: solid; "&vbCrLf
str=str&"	border-color: #000000; "&vbCrLf
str=str&"	border-width: 1px; "&vbCrLf
str=str&"	background-color: #FFFFFF; "&vbCrLf
str=str&"} "&vbCrLf
str=str&"td { "&vbCrLf
str=str&"	padding: 5px; "&vbCrLf
str=str&"	border-style: solid; "&vbCrLf
str=str&"	border-color: #000000; "&vbCrLf
str=str&"	border-width: 1px; "&vbCrLf
str=str&"} "&vbCrLf
str=str&"th { "&vbCrLf
str=str&"	padding: 5px; "&vbCrLf
str=str&"	border-style: solid; "&vbCrLf
str=str&"	border-color: #000000; "&vbCrLf
str=str&"	border-width: 1px; "&vbCrLf
str=str&"	background-color: silver; "&vbCrLf
str=str&"} "&vbCrLf
OutFile.WriteLine str

OutFile.WriteLine "</style>"
OutFile.WriteLine "</head><body>"
OutFile.WriteLine "<table>"
OutFile.WriteLine "<tr>"
OutFile.WriteLine "<th>名称</th>"
OutFile.WriteLine "<th>パス</th>"
OutFile.WriteLine "<th>コマンドライン</th>"
OutFile.WriteLine "</tr>"
nCnt = 0
For Each obj in col 
	OutFile.WriteLine "<tr>"
	strCss = ""
	if nCnt Mod 2 = 0 then
		strCss = "style='background-color:#D0D0D0;'"
	end if
	OutFile.WriteLine "<td nowrap " & strCss & "><B>" & obj.Caption & "</b></td>"
	OutFile.WriteLine "<td nowrap " & strCss & ">" & obj.ExecutablePath & "</td>"
	on error resume next
	OutFile.WriteLine "<td nowrap " & strCss & ">" & obj.CommandLine & "</td>"
	on error goto 0
	OutFile.WriteLine "</tr>"
	nCnt = nCnt + 1
Next 
OutFile.WriteLine "</table></body></html>"
OutFile.Close

Call WshShell.Run( "cmd.exe /c start " & "ProcessList.htm",0, true )

このソース内部の CSS 部分の出力文字列の作成は、テキスト変換サービスの VBS で可能です。





タグ:VBScript WMI
posted by at 2014-04-17 05:42 | VBScript | このブログの読者になる | 更新情報をチェックする

指定した位置でレジストリエディタを開く為のスクリプトをダウンロードします

 
レジストリの目的のパスを開くのは、慣れていても時間がかかります。VBScript の先頭のパス部分変えるだけで利用可能です。
 

以下のような VBScript としてダウンロードされます
strParam = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites"

' レジストリ書き込み用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' レジストリエディタが最後に開いていたキーの登録を行います
strPath = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey"
if GetOSVersion() >= 6 then
	strRegPath = "コンピュータ\" & strParam
else
	strRegPath = "マイ コンピュータ\" & strParam
end if

' 既に regedit が実行中の場合はいったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'regedit.exe'") 
For Each objProcess in colProcessList
	' 最後のウインドウの位置とサイズを保存する為の終わらせ方
	WshShell.AppActivate("レジストリ エディタ")
	Wscript.Sleep(500)
	WshShell.SendKeys ("%{F4}")
	Wscript.Sleep(500)
	' 上記終わらせ方が失敗した時の強制終了
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ"

' レジストリエディタを起動します
Call WshShell.Run( "regedit.exe" )
' レジストリエディタが終わるまで待つ場合は以下のようにします
' Call WshShell.Run( "regedit.exe", , True )

REM **********************************************************
REM OS バージョンの取得
REM **********************************************************
Function GetOSVersion()

	Dim colTarget,str,aData,I,nTarget

	Set colTarget = objWMIService.ExecQuery( _
		 "select Version from Win32_OperatingSystem" _
	)
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function

 


posted by at 2014-04-17 04:53 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年04月04日

VBScript : 3種のMDB(または accdb)内の テーブル一覧取得方法

ADO を使うのが通常ですが、ADOX または、Access を直接使用してもかまいません。
※ このテストは、Microsoft Office 2010 がインストールされている環境で実行しています。
' ▼ コマンドプロンプトを開いて、終了したら PAUSE する。
Crun()

' ************************************************
' 基本設定
' ************************************************
' このスクリプトが存在するディレクトリを取得
strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, WScript.ScriptName, "" )

' ************************************************
' OpenSchema
' ************************************************
Set Mdb = Wscript.CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strCurDir & "\販売管理B.mdb" & ";"
Mdb.Open strConnection
Set Schema = Mdb.OpenSchema( 20 ,Array(Empty,Empty,Empty,Empty) )

Wscript.Echo "販売管理B.mdb のテーブル一覧を OpenSchema で取得します" & vbCrLf
Do while not Schema.EOF

	Wscript.Echo Schema.Fields( "TABLE_NAME" ).Value
	Schema.MoveNext
Loop
Mdb.Close()

Wscript.Echo vbCrLf

' ************************************************
' ADOX.Catalog
' ************************************************
Set Adox = Wscript.CreateObject("ADOX.Catalog")
Adox.ActiveConnection = strConnection

Wscript.Echo "販売管理B.mdb のテーブル一覧を ADOX.Catalog で取得します" & vbCrLf
For Each Table in  Adox.Tables

	Wscript.Echo Table.Name

Next

Wscript.Echo vbCrLf


' ************************************************
' Access.Application
' ************************************************
Set Access = Wscript.CreateObject("Access.Application")
Access.OpenCurrentDatabase( strCurDir & "\販売管理B.mdb" )

Wscript.Echo "販売管理B.mdb のテーブル一覧を Access.Application で取得します" & vbCrLf
For Each Table in  Access.CurrentDb.TableDefs

	Wscript.Echo Table.Name

Next

For Each View in  Access.CurrentDb.QueryDefs

	Wscript.Echo View.Name

Next

Wscript.Echo vbCrLf

' ************************************************
' OpenSchema
' ************************************************
Set Mdb = Wscript.CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strCurDir & "\販売管理B.accdb" & ";"
Mdb.Open strConnection
Set Schema = Mdb.OpenSchema( 20 ,Array(Empty,Empty,Empty,Empty) )

Wscript.Echo "販売管理B.accdb のテーブル一覧を OpenSchema(2007以降) で取得します" & vbCrLf
Do while not Schema.EOF

	Wscript.Echo Schema.Fields( "TABLE_NAME" ).Value
	Schema.MoveNext
Loop
Mdb.Close()

Wscript.Echo vbCrLf

' ************************************************
' ADOX.Catalog
' ************************************************
Set Adox = Wscript.CreateObject("ADOX.Catalog")
Adox.ActiveConnection = strConnection

Wscript.Echo "販売管理B.accdb のテーブル一覧を ADOX.Catalog(2007以降) で取得します" & vbCrLf
For Each Table in  Adox.Tables

	Wscript.Echo Table.Name

Next

Wscript.Echo vbCrLf


' ************************************************
' Access.Application
' ************************************************
Set Access = Wscript.CreateObject("Access.Application")
Access.OpenCurrentDatabase( strCurDir & "\販売管理B.accdb" )

Wscript.Echo "販売管理B.accdb のテーブル一覧を Access.Application で取得します" & vbCrLf
For Each Table in  Access.CurrentDb.TableDefs

	Wscript.Echo Table.Name

Next

For Each View in  Access.CurrentDb.QueryDefs

	Wscript.Echo View.Name

Next

Wscript.Echo vbCrLf


Wscript.Echo("【"&WScript.ScriptName&"】の処理が終了しました" & vbCrLf & vbCrLf )

' **********************************************************
' Cscript.exe で実行を強制
' ウィンドウをアクティブにし、最大化ウィンドウとして表示(3)
' 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", 3 )
		WScript.Quit
	end if

End Function
' **********************************************************
' 文字列を " で囲む関数
' **********************************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function


処理結果
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

販売管理B.mdb のテーブル一覧を OpenSchema で取得します

MSysAccessStorage
MSysACEs
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
V_商品一覧
V_売上日付
V_得意先台帳
V_社員一覧
コード名称マスタ
コントロールマスタ
メッセージマスタ
取引データ
商品マスタ
商品分類マスタ
得意先マスタ
社員マスタ
郵便番号マスタ


販売管理B.mdb のテーブル一覧を ADOX.Catalog で取得します

MSysAccessStorage
MSysACEs
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
V_商品一覧
V_売上日付
V_得意先台帳
V_社員一覧
コード名称マスタ
コントロールマスタ
メッセージマスタ
取引データ
商品マスタ
商品分類マスタ
得意先マスタ
社員マスタ
郵便番号マスタ


販売管理B.mdb のテーブル一覧を Access.Application で取得します

MSysAccessStorage
MSysACEs
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
コード名称マスタ
コントロールマスタ
メッセージマスタ
取引データ
商品マスタ
商品分類マスタ
得意先マスタ
社員マスタ
郵便番号マスタ
V_商品一覧
V_売上日付
V_得意先台帳
V_社員一覧


販売管理B.accdb のテーブル一覧を OpenSchema(2007以降) で取得します

MSysAccessStorage
MSysACEs
MSysComplexColumns
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
MSysResources
V_商品一覧
V_売上日付
V_得意先台帳
V_社員一覧
コード名称マスタ
コントロールマスタ
メッセージマスタ
取引データ
商品マスタ
商品分類マスタ
得意先マスタ
社員マスタ
郵便番号マスタ


販売管理B.accdb のテーブル一覧を ADOX.Catalog(2007以降) で取得します

MSysAccessStorage
MSysACEs
MSysComplexColumns
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
MSysResources
V_商品一覧
V_売上日付
V_得意先台帳
V_社員一覧
コード名称マスタ
コントロールマスタ
メッセージマスタ
取引データ
商品マスタ
商品分類マスタ
得意先マスタ
社員マスタ
郵便番号マスタ


販売管理B.accdb のテーブル一覧を Access.Application で取得します

MSysAccessStorage
MSysACEs
MSysComplexColumns
MSysNavPaneGroupCategories
MSysNavPaneGroups
MSysNavPaneGroupToObjects
MSysNavPaneObjectIDs
MSysObjects
MSysQueries
MSysRelationships
MSysResources
コード名称マスタ
コントロールマスタ
メッセージマスタ
取引データ
商品マスタ
商品分類マスタ
得意先マスタ
社員マスタ
郵便番号マスタ
V_商品一覧
V_売上日付
V_得意先台帳
V_社員一覧


【table_list.vbs】の処理が終了しました
関連する記事

posted by at 2014-04-04 00:52 | VBScript | このブログの読者になる | 更新情報をチェックする

2014年03月14日

VBScript : 手軽にタスクスケジューラ時間差実行

サービスで、Task Scheduler が実行されている事が前提です。自分は普段止めているので、スクリプトからサービスを開始する処理を付け加える必要がありますが、通常なら問題無いでしょう。

分単位で連続して起動するパラメータも設定可能ですが、それなら GUI で登録するほうが確実です。これは、1時間後とか5分後とかそういう目的に使用します。( 一回限りの実行 )

Windows7 でテストしていますが、対話を必要とするようなアプリケーションはセキュリティ理由と思われますが、かつて可能であった InteractWithDesktop フラグが動作しませんでした。しかし純粋なバッチ処理では動作を確認しています。
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

ServiceString = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"
Set objWMIService = GetObject( ServiceString )
Set objScheduledJob = objWMIService.Get( "Win32_ScheduledJob" )

Set colEvents = objWMIService.ExecQuery _ 
	("Select * from Win32_TimeZone" )
For Each obj In colEvents
	Utc = obj.Bias
	Exit For
Next

Set objDate = CreateObject("WbemScripting.SWbemDateTime") 
' 一分後
dtTargetDate = Now() + Cdate("0:01:00")
objDate.SetVarDate dtTargetDate, False
objDate.UTC = Utc
'Wscript.Echo objDate

Dim ret,JobId

ret = objScheduledJob.Create( "cscript.exe C:\user\lightbox\vbs\wk001\test.vbs", _
	objDate & "",,,,,JobId )

'Wscript.Echo ret
'Wscript.Echo JobId

'0 要求はが受け付けられました
'1 この要求はサポートされていません
'2 ユーザーは、必要なアクセス権限がありません
'8 Interactive process.
'9 The directory path to the service executable file cannot be found.
'21 無効なパラメータです
'22 アカウントにサービスにアクセスする権限がありません


▼ 動作を確認したスクリプト
Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.LogEvent 0, "ログ出力"

Set Fso = CreateObject( "Scripting.FileSystemObject" )
strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

Set OutObj = Fso.OpenTextFile( strCurPath & "\バッチ.txt", 2, True )
OutObj.WriteLine "あいうえお"
OutObj.Close

実行後の確認は、コマンドプロンプトを管理者権限で実行して、at を実行すると登録された JOB が表示されます。何らかの理由で、実行に失敗するとタスク実行予定に残ったままになるので、 at JOB番号 /delete で削除します。


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

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

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

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

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


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

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

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

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

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