SQLの窓

2018年02月18日


VBscript(または JScript) で簡単にバイナリファイルをアップロードする

PHP 側も単純ですが、PHP のマニュアルに書いている場所は、少し見付けづらいかもしれません。

内容は PUT メソッドで始まっていますが、VBScript からは POST で問題ありません。実際の内容は、Apache 上で PUT メソッドを PHP でサポートするお話なので、重要なのは PHP での記述方法です。

put.php ( utf-8n )
<?PHP
header( "Content-Type: text/html; charset=utf-8" );

$id = uniqid();

$fp = fopen( "php://input", "rb" );
$wfp = fopen( "data/{$id}_upload.dat", "wb" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);


?>
データが保存されました

この URL に対して、VBScript のコマンドは POST であろうが、PUT であろうがどちらでもかまいません。

open Method (ServerXMLHTTP/IServerXMLHTTPRequest)
' *************************************
' サーバーオブジェクトを使用しています
' *************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' Stream オブジェクト の作成
Set Stream = CreateObject("ADODB.Stream")
' Stream のオープン
Stream.Open
' Stream タイプの指定
Stream.Type = 1		' StreamTypeEnum の adTypeBinary
' 既存ファイルの内容を Stream に読み込む
Stream.LoadFromFile "target.png"

' ▼ ご自分の環境に書き換えてください。
Call objHTTP.Open("POST","https://yourdomain/test/put.php",False)

nLen = Stream.Size
data = Stream.Read(nLen)

Call objHTTP.SetRequestHeader("Content-Length",nLen)
Call objHTTP.Send(data)

Wscript.Echo objHTTP.responseText
 
' Stream を閉じる
Stream.Close

setRequestHeader Method 
setTimeouts Method
send Method 

Stream オブジェクト

※ Microsoft は VB を真剣にやめたいみたいですね

なので、以下には JScript で書いたソースコードです。JScript では、大文字、小文字が区別されるので、いろいろ注意する必要があります。

upload.js
// *************************************
// サーバーオブジェクトを使用しています
// *************************************
objHTTP = new ActiveXObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

// *************************************
// バイナリファイル
// *************************************
Stream = new ActiveXObject("ADODB.Stream")
upload_file = "winofsql.png"

// *************************************
// アップロード先
// localhost(AN HTTPD)でテストできます
// *************************************
upload_url = "http://yourdomain/put/put.php"

// *************************************
// 準備
// *************************************
objHTTP.open( "POST",upload_url, false )

// *************************************
// バイナリデータ取得
// *************************************
Stream.Open()
Stream.Type = 1
Stream.LoadFromFile(upload_file)
nLen = Stream.Size
data = Stream.Read(nLen)

// *************************************
// 送信
// *************************************
objHTTP.setRequestHeader("Content-Length",nLen)
objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
objHTTP.send(data)

WScript.Echo(objHTTP.responseText)

// Stream を閉じる
Stream.Close

ActiveXObject オブジェクト


関連する記事


posted by lightbox at 2018-02-18 16:29 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする

2018年02月17日


PHP : WEB でもコマンドラインでも HTTP でファイルをダウンロードする 『fget.php』

fopen wrappers が有効の場合、WEB 上で配置するとそのサーバー以外の別のサーバにあるファイルを http 経由でいったん読み込んでからクライアントへ送ります。その際、ファイルサイズが必要になるので、readfile に先立って、cURL で、ファイルサイズだけを取得しています。

readfile は、このような処理に使う為の関数ですが、標準出力へ内容を出力するので、コマンドプロンプトで使う場合は、ファイルへリダイレクトする必要があります。なので、ここでは通常のファイル処理としてファイルを書き込んでいます。

fget.php
<?php
// **************************************************
// 【fget.php】
// http:// で他のサーバのファイルを読み込んでダウンロードします
// 【利用方法】
// WEB : fget.php?target=URLエンコードされたURL
// CMD : php.exe fget.php URL
// **************************************************

// **************************************************
// コマンドラインでも使えるように
// **************************************************
if (substr(php_sapi_name(), 0, 3) == 'cgi') {
	$remoteFile = $_GET['target'];
}
else {
	$remoteFile = $argv[1];
}
$fileName = basename($remoteFile);

// **************************************************
// PHP オンラインマニュアルの投稿データより
// **************************************************
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if ( substr( $remoteFile, 0, 5 ) == "https" ) {
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
}
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
	echo 'cURL failed';
	exit;
}

$contentLength = 'unknown';
$status = 'unknown';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
	$status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
	$contentLength = (int)$matches[1];
}

// **************************************************
// WEB 経由ダウンロード
// **************************************************
if (substr(php_sapi_name(), 0, 3) == 'cgi') {
	header( "Content-Type: application/octet-stream" );
	header( "Content-disposition: attachment; filename={$fileName}" );

	$path = $remoteFile;

	header( "Content-Length: $contentLength" );

	readfile($path);

	exit();
}
// **************************************************
// Windows コマンドライン
// Windows では、fopen()の mode パラメータに 'b' を
// 指定してファイルをオープンする必要があります。
// **************************************************
else {
	$ihandle = fopen($remoteFile, "rb");
	$ohandle = fopen($fileName, "wb");
	if ( $ihandle ) {

		while( !feof($ihandle) ) {
			$ret = fread( $ihandle, 1024 );
			fwrite( $ohandle,  $ret );
		}

		fclose( $ohandle );
		fclose( $ihandle );
	}

	exit();
}

?>


関連する情報

PHP fread

fread の第二引数は、読み込む最大バイトなので、EOF に達すると、それ以内のデータが取得されます。

PHP fwrite

大きなファイルですと、問題が出るという報告もあるので、その場合は以下のように readfile を書き換えるといいかもしれません。
Streaming a large file using PHP

Problem with download of larger files





posted by lightbox at 2018-02-17 16:00 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2018年02月16日


HTA : 指定したキーでレジストリエディタを開く



WSH : 指定したキーでレジストリエディタを開く は、WSH での処理なので、どちらかと言えばバッチ処理です。連続してレジストリエディタの作業をするのでは無く、その場限りの処理で使ったりします( とにかくある場所のレジストリキーを開きたい等 )

このサンプルは、ある目的の作業中にレジストリエディタの特定のキーを、何度も連続して開く事を想定していますので、GUI を持つ HTA を使っています。
右端のアイコンよりダウンロードできます
<SCRIPT language="VBScript">

	Dim WshShell

	Set WshShell = CreateObject( "WScript.Shell" )

	Dim objWMIService

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

</SCRIPT>
<html>
<head>
<title>指定したキーでレジストリエディタを開く</title>
<meta http-equiv="content-type" content="text/html; charset=SHIFT_JIS">
<HTA:APPLICATION ID="Sqlwin"
	BORDERSTYLE="sunken"
	INNERBORDER="yes"
	SCROLL="no"
	ICON="http://winofsql.jp/WinOfSql.ico"
>

<style type="text/css">
* {
	font-family: "メイリオ"
	font-size: 16px;
}
body {
	margin:0;
	background-color: white;
}

.action {
	margin-top: 20px;
	margin-left: 20px;
}

</style>

<SCRIPT language="VBScript">

Function ActionOpenReg( str )

	Dim colProcessList

	Set colProcessList = objWMIService.ExecQuery _ 
		("Select * from Win32_Process Where Name = 'regedit.exe'") 
	For Each objProcess in colProcessList 
		WshShell.AppActivate("レジストリ エディタ")
		WshShell.SendKeys ("%{F4}")
	Next 

	Call window.setTimeout("Call OpenReg(""" & str & """)", 500 )

End Function

Function OpenReg( str )

	Dim colProcessList

	Set colProcessList = objWMIService.ExecQuery _ 
		("Select * from Win32_Process Where Name = 'regedit.exe'") 
	For Each objProcess in colProcessList 
		on error resume next
		objProcess.Terminate() 
		on error goto 0
	Next 

	Dim strRegSavePoint

	if GetOSVersion() >= 6 then
		str = "コンピュータ\" & str
	else
		str = "マイ コンピュータ\" & str
	end if

	strRegSavePoint = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey"
	WshShell.RegWrite "HKCU\" & strRegSavePoint, str, "REG_SZ"

	Call WshShell.Run( "regedit" )

End Function

' **********************************************************
' OS バージョンの取得
' **********************************************************
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
</SCRIPT>


</head>
<body>

<input class="action" type="text" id="key" style='width:600px;' value="HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run">
<input class="action" type="button" value=" 開く " onClick='Call ActionOpenReg(document.getElementById("key").value)'>

</BODY>
</html>
<SCRIPT for="window" event="onload" language="VBScript">

	window.focus()
	top.moveTo 0, 0
	top.resizeTo 800, 120

</SCRIPT>

<SCRIPT for="window" event="onunload" language="VBScript">


</SCRIPT>




posted by lightbox at 2018-02-16 08:27 | VBScript | このブログの読者になる | 更新情報をチェックする

PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法

どちらでも自分の運用で正しく動けばいいのですが、ほんの少し落とし穴もあるようなので知っておいたほうがよさそうです。( というか、Microsoft と一緒に生きて行くにはではデフォルトというか... )

PowerShell の Add-Type と [Reflection.Assembly]

記述部分によって、最初の System. が省略できる場合もあるようですが、差が良く解らないので 全て System. から書いています。

Add-Type

Add-Type では、他の使い方というか、C#のコードを利用する みたいなのもあります。

powershell -NoProfile -ExecutionPolicy Unrestricted .\addtype.ps1

▼ コマンドラインが長いので ps.bat を Windows フォルダに作成しておきます
powershell -NoProfile -ExecutionPolicy Unrestricted %1
Add-Type -assemblyName System.Windows.Forms

$obj = New-Object System.Windows.Forms.OpenFileDialog

$obj.Filter = 'Excel|*.xlsx|旧 Excel|*.xls|全て|*.*'

$obj.InitialDirectory = 'c:\'

if ($obj.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
	$obj.FileName
}
else {
	'キャンセルされました'
}

ダウンロードした場合は、セキュリティの警告が出るので、エディタで上書き保存するかプロパティの『セキュリティ』で許可にチェックして『適用』します。

C# のソースコードで書いたほうが簡単
$code = @"
using System.Windows.Forms;
public class MyClass {
	public static string Open() {

		OpenFileDialog obj = new OpenFileDialog();
		obj.Filter = "Excel|*.xlsx|旧 Excel|*.xls|全て|*.*";
		obj.InitialDirectory = @"C:\";

		if (obj.ShowDialog() == DialogResult.OK) {
			return obj.FileName;
		}
		else {
			return "キャンセルされました";
		}

	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

[MyClass]::Open()

[System.Reflection.Assembly]::LoadWithPartialName

powershell -NoProfile -ExecutionPolicy Unrestricted .\assembly.ps1
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')

$obj = New-Object System.Windows.Forms.OpenFileDialog

$obj.Filter = 'Excel|*.xlsx|旧 Excel|*.xls|全て|*.*'

$obj.InitialDirectory = 'c:\'

if ($obj.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
	$obj.FileName
}
else {
	'キャンセルされました'
}


関連する記事

PowerShell でエクスプローラでコピーしたファイルリストを取得して、テキストのクリップボードに再度コピーしなおす

参考

Windows PowerShell プロファイル

PowerShellスクリプティングの第一歩(後編)


posted by lightbox at 2018-02-16 06:56 | Comment(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年02月13日


PowerShell でエクスプローラでコピーしたファイルリストを取得して、テキストのクリップボードに再度コピーしなおす

Windows10 のデフォルトコマンドウインドウが、PowerShell になったので久しぶりに動作確認をしました。基本的に実行ポリシーは変わっておらず、そのままでは .ps1 スクリプトを実行できません。しかし、PowerShell のプロンプトから cmd と入力すれば従来のコマンドプロンプトになるので、以下のようにして実行します。

powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1

▼ コマンドラインが長いので ps.bat を Windows フォルダに作成しておきます
powershell -NoProfile -ExecutionPolicy Unrestricted %1
ファイルリストを \r\n 改行のテキストとしてクリップボードへ PowerShell では、.NET Framework を使用できるので、わざわざ C# 等で実行形式のアプリを作成せずとも、C# のコードを知っておればインターネットを調べながら成果物を作成するのはそれほど難しい事ではありません。 手軽に実行できる VBScript はまだ健在なので、VBScript から PowerShell のスクリプトを呼び出せば、かなりできる事の幅が膨らむのでは無いかと思っています。しかしいかんせん、PowerShell を真剣にやり出すとかなり面倒くさい事にもなりそうなので、しばらくは様子をうかがっていきたいと思っています。( csc.exe とか動かなくなってしまったので )
Add-Type -assemblyName System.Windows.Forms

$obj = [System.Windows.Forms.Clipboard]::GetFileDropList()

if ( $obj -eq $null ) {
	[System.Console]::WriteLine("NULL")
}
else {
	if ( $obj.Count -eq 0 ) {
		[System.Console]::WriteLine("データがありません")
	}
	else {
		$text = ""
		foreach($data in $obj){
			$text += $data + "`r`n"
		}
		[System.Windows.Forms.Clipboard]::SetText($text)
	}
}

ダウンロードした場合は、セキュリティの警告が出るので、エディタで上書き保存するかプロパティの『セキュリティ』で許可にチェックして『適用』します。

※ 参考 : PowerShellスクリプティングの第一歩
( 2007年09月20日 の記事なんですけど、いまさら Windows10 って大丈夫かなぁ... )



posted by lightbox at 2018-02-13 01:38 | Comment(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年02月12日


Seesaa の記事に下の『最新の同カテゴリのリスト』のリンクの最後に付く ?seesaa_related=category を削除する方法

どうも、Google が嫌がってるように気がしてならないので削除しました。jQuery 前提なので申し訳無いですが、JavaScript でゴリゴリ書くと長くなるので。

場所は、コンテンツの『記事』の コンテンツHTML編集 でテンプレートを直接変更します。場所は、記事の下の listCategoryArticle を探せばいいと思います。

追加する部分は script 部分のみ <script> 〜 </script> です。
<div class="listCategoryArticle">
【<% article_category.name %>の最新記事】<br />
<ul style='padding-right:25px;'>
<% loop:list_category_article %>
<li><a style='font-size:16px;box-shadow:none;' href="<% article.page_url %>"><% article.subject | text_summary(100) %></a></li>
<% /loop %>
</ul>
<script>
$(".listCategoryArticle a").each( function(){
   var url = $(this).prop("href");
   url = url.replace("?seesaa_related=category","");
   $(this).prop("href", url);
} );
</script>
</div>



タグ:Seesaa javascript
posted by lightbox at 2018-02-12 20:12 | Comment(0) | JavaScript | このブログの読者になる | 更新情報をチェックする

自サイト(logical error を含む)で使用している SyntaxHighlighter のツールバーの問題点をごっそり自前で修正・カスタマイズしました。( その2 / ソースをクリップボードにコピー )

関連する記事

自サイト(logical error を含む)で使用している SyntaxHighlighter のツールバーの問題点をごっそり自前で修正・カスタマイズしました。( その1 / ソースの表示 )



SyntaxHighlighter でソースコードをクリップボードへコピーしていたのは、元々は Flash でした。現在はHTML のボタンに差し替えていますが、昔は object 要素が埋め込まれていました。なので、差し替え方法としては object のあった場所に button を作成する事になります。

元々、innerHTML の中に文字列をセットしていただけなので、特別な問題無く差し替える事ができています。問題は、クリップボードの処理をどのように実装するかというところが重要ですが、これは clipboard.js というライブラリを使用する事によって、IE11 という面倒なブラウザの対応も容易になっています。

以下のサンプルでは、innerHTML 以外の方法として、jQuery と document.write による実装を行っています。パターンが4つあるのは、JavaScript 内で日本語記述をしないようにコード化を行っています。HTMLエンティティのほうは、ブラウザに表示される時に日本語表現となります。unicode 文字列は、JavaScript が文字列として読み込んだ瞬間に日本語表現になります。
( ※ SyntaxHighlighter 内の既存ソース内へ追加する為、日本語を使用しないようにしています。 )

この場合どちらも結果は同じですが、JavaScript では 後者が重要です。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.12/clipboard.js"></script>
<script>
$(function () {

	// jQuery でボタン作成
	$(html1).appendTo(document.body);
	$(html2).appendTo(document.body);

	// クリップボード用のトリガーとなる要素が持つクラスを決定する
	// ( ボタンにこのクラスをセットしておく )
	var clipboard = new Clipboard('.my_clipboard');

	// ボタンのイベントで、クリップボード転送用のエリアへデータを送る
	// ( ボタンに data-clipboard-target で、エリアの id をセットしておく )
	$(".my_clipboard").on("click", function(){
		var time = (new Date()).getTime();
		console.log(time);
		$("#target_clipboard").text(time);
	});

	// それに対するクリップボードへコピー後の処理( 無くてもいい )
	clipboard.on('success', function(e) {
		e.clearSelection();
		alert("クリップボードにコピーしました");
	});

});

var html1 = "<button style='vertical-align:top;border-radius:4px;height:16px;line-height:8px;' class=\"my_clipboard\" data-clipboard-target=\"#target_clipboard\" title=\"&#12463;&#12522;&#12483;&#12503;&#12508;&#12540;&#12489;&#12408;&#12467;&#12500;&#12540;&#12375;&#12414;&#12377;\">copy1</button>"

var html2 = "<button style='vertical-align:top;border-radius:4px;height:16px;line-height:8px;' class=\"my_clipboard\" data-clipboard-target=\"#target_clipboard\" title=\"\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u3078\u30b3\u30d4\u30fc\u3057\u307e\u3059\">copy2</button>"

var html3 = "<button style='vertical-align:top;border-radius:4px;height:16px;line-height:8px;' class=\"my_clipboard\" data-clipboard-target=\"#target_clipboard\" title=\"&#12463;&#12522;&#12483;&#12503;&#12508;&#12540;&#12489;&#12408;&#12467;&#12500;&#12540;&#12375;&#12414;&#12377;\">copy3</button>"

var html4 = "<button style='vertical-align:top;border-radius:4px;height:16px;line-height:8px;' class=\"my_clipboard\" data-clipboard-target=\"#target_clipboard\" title=\"\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u3078\u30b3\u30d4\u30fc\u3057\u307e\u3059\">copy4</button>"

// ボタンを文字列として出力して作成
document.write(html3);
document.write(html4);

</script>

<div id="target_clipboard" style='position:absolute;left:-1000px;width:900px;white-space:pre-wrap;word-wrap:break-word;'></div>
※ ボタンは、copy3 copy4 copy1 copy2 という順序で作成されます。

jQuery の $(function(){}) は、ページがロードされた後に実行されるので、まず copy3 と copy4 が作成されます。その後、$(function(){}) の最初にある記述で、copy1 と copy2 が作成されます。そして、それぞれに対してクリップボードのオブジェクトと、クリックイベントを関係付けています。



posted by lightbox at 2018-02-12 19:41 | Comment(0) | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

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
※ UserDomain プロパティが 動作するには、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 ベーシック | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり