SQLの窓

2019年03月01日


VBScript : スクリプトを終了しないようにする

目的としてはいろいろ考えられますが、ここではよく使われる Sleep の代わりになり、ずっと待ち状態になる方法を紹介します。実際は、時分秒を指定して指定した時刻にのみ処理を開始する事もできます(そのほうが現実的です)。

' このセクションは、cscript.exe で処理を強制させるものです
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	str = WScript.ScriptFullName
	Set WshShell = CreateObject( "WScript.Shell" )
	Call WshShell.Run( "cmd.exe /c cscript.exe """ & str & """ & pause", 3 )
	WScript.Quit
end if

' WMI の処理の為のオブジェクトを取得
Set obj = GetObject("winmgmts:\\.\root\cimv2")
' イベントの定義
Set objMonitor = obj.ExecNotificationQuery( _
	"select * from __InstanceModificationEvent " & _
	"where TargetInstance isa 'Win32_LocalTime' " & _
	" and TargetInstance.Year = 0" _
)

Wscript.Echo "TargetInstance.Year は 0 にならないので、次の行より後の処理は実行されません"
Set objLatestEvent = objMonitor.NextEvent 
Wscript.Echo "ここは実行されません"




プロバティとしては以下が使用できます
class Win32_LocalTime : Win32_CurrentTime
{
  uint32 Day;
  uint32 DayOfWeek;
  uint32 Hour;
  uint32 Milliseconds;
  uint32 Minute;
  uint32 Month;
  uint32 Quarter;
  uint32 Second;
  uint32 WeekInMonth;
  uint32 Year;
};


▼ 実際に select * from Win32_LocalTime で取得したサンプルです
DayDayOfWeekHourMillisecondsMinuteMonthQuarterSecondWeekInMonthYear
2241949522242014




タグ:VBScript WMI
posted by lightbox at 2019-03-01 13:25 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2019年02月28日


PHP : unset によるオブジェクトのプロパティのと配列の要素の削除

unset() は指定した変数を破棄します。その結果オブジェクトではプロパティが削除され、連想配列ではその変数が削除されます

Run code で検証

※ 日本語のプロパティなので、$obj->{"手当"} というように参照します

get_object_vars : 非 static プロパティを連想配列として返します
$format1 = <<<FIELD
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "",
    "性別": "",
    "作成日": "",
    "更新日": "",
    "給与": "",
    "手当": "",
    "管理者": "",
    "生年月日": ""
}
FIELD;

print "\n-----------------------------------";
print "\nJSON文字列\n";
print $format1;

print "\n-----------------------------------";
print "\nオブジェクトに変換したもの\n";

$obj = json_decode($format1);
print_r($obj);

print "\n-----------------------------------";
print "\n『手当』プロパティを削除\n";
unset($obj->{"手当"});

print_r($obj);

print "\n-----------------------------------";
print "\n配列に変換したもの\n";

$array = get_object_vars( $obj );
print_r( $array );

print "\n-----------------------------------";
print "\n配列の要素を削除\n";

unset($array["所属"]);
    
print_r( $array );


実行結果
-----------------------------------
JSON文字列
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "",
    "性別": "",
    "作成日": "",
    "更新日": "",
    "給与": "",
    "手当": "",
    "管理者": "",
    "生年月日": ""
}
-----------------------------------
オブジェクトに変換したもの
stdClass Object
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [手当] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
『手当』プロパティを削除
stdClass Object
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
配列に変換したもの
Array
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
配列の要素を削除
Array
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)




タグ:PHP
posted by lightbox at 2019-02-28 15:59 | PHP | このブログの読者になる | 更新情報をチェックする

2019年02月19日


エクスプローラを再起動して、ショートカットの拡張子( .LNK ) を表示するようにする / VBScript



このレジストリキー内の NeverShowExt の名称を AllwaysShowExt に変更すると .LNK 拡張子が表示されるようになります。

※ ダウンロードされるスクリプトでレジストリの該当場所が開かれます。
( コンピューター\HKEY_CLASSES_ROOT\lnkfile )
※ 他にも コンピューター\HKEY_CLASSES_ROOT\InternetShortcut があります

但し変更してもすぐには反映されないのでエクスプローラを再起動する必要があります。まともにそれを行うにはいったんログオフする必要がありますが、以下のスクリプトで再起動できます。

' **********************************************************
' エクスプローラ(explorer.exe) の再起動
' **********************************************************
strTarget = "explorer.exe"

' 起動用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' いったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = '"&strTarget&"'") 
For Each objProcess in colProcessList
	on error resume next
	' 通常はこれで終了されるはず
	objProcess.Terminate() 
	if Err.Number <> 0 then
		' もし終了できなかった場合の強制終了
		Call WshShell.Run("taskkill /F /PID " & objProcess.ProcessId, 0 ) 
	end if
	on error goto 0
Next 

' 少し待ちます
Wscript.Sleep(500)
' エクスプローラを起動
WshShell.Run( strTarget )






タグ:Windows howto
posted by lightbox at 2019-02-19 20:33 | Windows | このブログの読者になる | 更新情報をチェックする

2019年02月18日


64ビット PC の VBScript で 32ビット ODBC ドライバの一覧を取得する( ODBC 接続のドライバ文字列を正しく取得したい )

最初の『管理者として cscript 実行を強制する』は、cscript での実行を強制するついでに実装しています。(なんらかの制限環境でも動くようにとの考慮です。)

目的は、レジストリのキーの一覧ですが、キーの一覧は知る限り、WMI でしか取得できないので、GetObject("Winmgmts:root\default:StdRegProv") でレジストリ処理用のオブジェクトを取得して使用します。

一覧表示は、cscript で実行を強制しているので単純に Wscript.Echo で出力。コマンドプロンプトを新たに作成して実行するので、結果の表示を止めるために、Wscript.StdIn.ReadLine です。
' 管理者として cscript 実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "cscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

const WMI_HKEY_LOCAL_MACHINE = &H80000002

Set objRegistry = GetObject("Winmgmts:root\default:StdRegProv")

strBasePath = "SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI"

Call objRegistry.EnumKey( WMI_HKEY_LOCAL_MACHINE, strBasePath, aKeys )

For Each strKeyPath in aKeys
	Wscript.Echo strKeyPath
Next

Wscript.StdIn.ReadLine

実際はいくつか変なのが混じっていますが ODBC 接続のドライバ文字列が欲しい場合を想定しているので、その場合はそれは排除して見れると思います。



※ コマンドプロンプトのプロパティで、簡易編集モードを ON にして、範囲をドラッグして右クリックでコピーできます。

※ コマンドプロンプトならば、『reg query HKLM\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI』ですから、リダイレクトしてファイルに表示結果を書き込めばいいでしょう( 但し、キーが全て表示されるのでとても見にくいです )
reg query HKLM\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI > list.txt
posted by lightbox at 2019-02-18 17:03 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

jQuery の nextAll と prevAll で、テーブル行の任意のセルをクリックしてその行の全ての TD 内のデータを取得する

nextAll は、起点となる要素から下方向に存在する同じ階層の要素を全て取得します。引数にセレクタが指定できるので、ここでは TD にクラスを設定して目的の要素を特定しています。

特定する要素の属性が無い場合は、$(this).nextAll().eq(0).text() のようにして eq(順序番号) を指定して特定できます。但し、prevAll では近い要素から順序番号が小さくなるので注意して下さい。

コード 名称 金額 購入日 担当者 発注先
0002 問題集 002 4000 2015/08/24 田中 発注先002
0003 問題集 003 3000 2015/08/23 山田 発注先003
0004 問題集 004 2000 2015/08/22 山田 発注先004
0001 問題集 001 1000 2015/08/21 田中 発注先001
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(function() {

	// 名称のリンクに設定したクラスでイベント作成
	// ※ 各 td のクラスで取得
	$(".check").on("click", function(){
		$("#cd").val($(this).prevAll(".t0").text());
		$("#name").val($(this).text());
		$("#kin").val($(this).nextAll(".t1").text());
		$("#bdate").val($(this).nextAll(".t2").text());
		$("#tanto").val($(this).nextAll(".t3").text());
		$("#co").val($(this).nextAll(".t4").text());
	});

	// 購入日のリンクに設定したクラスでイベント作成
	// ※ 各 td の順序で取得
	$(".t2").on("click", function(){
		$("#cd").val($(this).prevAll().eq(2).text());
		$("#name").val($(this).prevAll().eq(1).text());
		$("#kin").val($(this).prevAll().eq(0).text());
		$("#bdate").val($(this).text());
		$("#tanto").val($(this).nextAll().eq(0).text());
		$("#co").val($(this).nextAll().eq(1).text());
	});

});

</script>
<style type="text/css">
.check, .t2 {
	text-decoration: underline;
	cursor: pointer;
	color: blue;
}
#target_area th, #target_area td {
	padding: 5px;
}
#target_area input {
	width:120px;
	font-size: 18px;
}
#target_area table {
	margin-top: 10px;
	border-collapse: collapse;
	border: solid #000000 1px;
	background-color: #ffffff;
}
#target_area th {
	border: solid #000000 1px;
	background-color: silver;
}
#target_area td {
	border: solid #000000 1px;
}
</style>
<div id="target_area">
<p><input id="cd"> <input id="name"> <input id="kin"></p>
<p><input id="bdate"> <input id="tanto"> <input id="co"></p>
<table>
	<tbody>
	<tr>
		<th>コード</th>
		<th>名称</th>
		<th>金額</th>
		<th>購入日</th>
		<th>担当者</th>
		<th>発注先</th>
	</tr>
	<tr>
		<td class="t0">0002</td>
		<td class="check">問題集 002</td>
		<td class="t1">4000</td>
		<td class="t2">2015/08/24</td>
		<td class="t3">田中</td>
		<td class="t4">発注先002</td>
	</tr>
	<tr>
		<td class="t0">0003</td>
		<td class="check">問題集 003</td>
		<td class="t1">3000</td>
		<td class="t2">2015/08/23</td>
		<td class="t3">山田</td>
		<td class="t4">発注先003</td>
	</tr>
	<tr>
		<td class="t0">0004</td>
		<td class="check">問題集 004</td>
		<td class="t1">2000</td>
		<td class="t2">2015/08/22</td>
		<td class="t3">山田</td>
		<td class="t4">発注先004</td>
	</tr>
	<tr>
		<td class="t0">0001</td>
		<td class="check">問題集 001</td>
		<td class="t1">1000</td>
		<td class="t2">2015/08/21</td>
		<td class="t3">田中</td>
		<td class="t4">発注先001</td>
	</tr>
	</tbody>
</table>
</div>






タグ:jquery
posted by lightbox at 2019-02-18 12:02 | メソッド:jQuery | このブログの読者になる | 更新情報をチェックする

2019年02月15日


「送る」からファイルのダンプ





※コマンドプロンプトの操作
Q : 終了します。
スペースキー : 次ページを表示します。
Enterキー : 次の行を表示します


自分で環境を作って、VBScript のコードファイルも自分で配置する場合は以下をご覧下さい。

SendTo フォルダにショートカットを作成する



この時、作業フォルダーを用意してそこに VBScript のコードファイルを保存します。実行するコマンドラインは以下のようになっています。

%windir%\system32\wscript.exe dump.vbs 35

35 は、コマンドプロンプトに一度に表示する行数です

dump.vbs( 作業フォルダーに置いてください )
if WScript.Arguments.Count = 1 then
	strMessage = "送るから実行して下さい" & vbCrLf & vbCrLf
	strMessage = strMessage & "※ リンク先の最後の数字はコマンドプロンプトの行数です   " & vbCrLf
	strMessage = strMessage & "※ プロパティよりウインドウを最大化する方法もあります   " & vbCrLf
	Call MsgBox(strMessage,0,"lightbox")
	Wscript.Quit
end if

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

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

strCommand = "cmd /c mode CON lines="&WScript.Arguments(0)&" & cscript.exe """ & _
strCurPath & "\dump_c.vbs"" """ & WScript.Arguments(1) & """ | more & pause"
Call WshShell.Run( strCommand )


dump_c.vbs
' ****************************************************
' ファイルを16進数でダンプします
' ****************************************************
Dim Fs,Stream
Dim InFile
Dim Kana
Dim KjFlg
Kana = Array( _
"。","「","」","、","・","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ", _
"ー","ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ", _
"タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ", _
"ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン","゙","゚" )

Set Fs = CreateObject( "Scripting.FileSystemObject" )
Set Stream = CreateObject("ADODB.Stream")

InFile = WScript.Arguments(0)

Dim LineBuffer,DispBuffer,CWork,nCnt,strBuff,i,j

if not Fs.FileExists( InFile ) then
	Wscript.Echo "ファイルが存在しません"
	Wscript.Quit
end if

' ------------------------------------------------------
' Stream のオープン
Stream.Open
 
' ------------------------------------------------------
' Stream タイプの指定
Stream.Type = 1		' StreamTypeEnum の adTypeBinary
 
' ------------------------------------------------------
' 既存ファイルの内容を Stream に読み込む
Stream.LoadFromFile InFile
 
' ------------------------------------------------------
' バイナリ型の Stream オブジェクトからを読み取って加工
Bcnt = 0
nCnt = 0
KjFlg = ""

Do while not Stream.EOS

	if ( nCnt MOD 16 ) = 0 then
		Wscript.Echo "          0  1  2  3  4  5  6  7" _
		& "  8  9  A  B  C  D  E  F"
		Wscript.Echo "--------------------------------" _
		& "------------------------------------------"
	end if

	' 16 バイトの読込
	LineBuffer = Stream.Read(16)

	strBuff = ""
	For i = 1 to LenB( LineBuffer )
		CWork = MidB(LineBuffer,i,1)
		Cwork = AscB(Cwork)
		Cwork = Hex(Cwork)
		Cwork = Ucase(Cwork)
		Cwork = Right( "0" & Cwork, 2 )
		DispBuffer = DispBuffer & Cwork & " "
		strBuff = strBuff & CharConv( Cwork )
	Next

	Wscript.Echo _
		Right( _
			"00000000" & Ucase(Hex( nCnt * 16 )), 8 _
		) & " " & _
		Left(DispBuffer & String(49," "), 49 ) & strBuff
	DispBuffer = ""

	nCnt = nCnt + 1
 
Loop
 
' ------------------------------------------------------
' Stream を閉じる
Stream.Close

Set Stream = Nothing
Stream = Empty
Set Fs = Nothing
Fs = Empty

' ****************************************************
' 生データのテキスト
' ****************************************************
function CharConv( HexCode )

	Dim nCode

	nCode = Cint( "&H" & HexCode )

	if KjFlg = "" then
		if &H81 <= nCode and nCode <= &H84 or _
			&H88 <= nCode and nCode <= &H9f or _
			&HE0 <= nCode and nCode <= &HEA then
			KjFlg = HexCode
			CharConv = ""
			Exit Function
		end if
	else
		if HexCode <> "00" then
			KjFlg = KjFlg & HexCode
			CharConv = Chr( Cint( "&H" & KjFlg ) )
		else
			CharConv = ".."
		end if
		KjFlg = ""
		Exit Function
	end if

	if 0 <= nCode and nCode <= &H1F then
		CharConv = "."
	end if
	if &H20 <= nCode and nCode <= &H7E then
		CharConv = Chr(nCode)
	end if
	if &H7F <= nCode and nCode <= &HA0 then
		CharConv = "."
	end if
	if &HA1 <= nCode and nCode <= &HDF then
		CharConv = Kana(nCode-&HA1)
	end if
	if &HE0 <= nCode and nCode <= &HFF then
		CharConv = "."
	end if

end function

ショートカットを直接実行すると、以下のようなダイアログが出ます



最大化は、dump.vbs の 17行目からを、画面の解像度に合わせてカラム数を以下のように設定して実行時のウインドウを選択すると実装できます( ただ、ダンプの表示幅が決まっているのでこの場合あまり意味ありません )

strCommand = "cmd /c mode CON cols=160 & cscript.exe """ & _
strCurPath & "\dump_c.vbs"" """ & WScript.Arguments(1) & """ | more & pause"
Call WshShell.Run( strCommand, 3 )

操作補足

エクスプローラで SendTo フォルダに移動するには、アドレスバーに sendto と直接入力します。





posted by lightbox at 2019-02-15 10:44 | 右クリックで「送る」 | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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