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

2019年08月22日

JScript( WSH ) : fake sendmail for windows でメールを送信する

関連する記事

fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信 : Gmail なので ssl(465)
VBScript : JavaScript のライブラリを呼び出して、Base64 エンコードを行う

ソースコードを読んだら、標準入力に -t は必要無くて、引数にファイルを指定して実行可能でした。

JScript で実行する以上、標準入力に直接アクセスして処理しています。

テストすると、今時の WEB メーラでは本文は普通に UTF-8 で利用可能でした。有名どころの WEB メーラですと、Subject も そのままで可能でしたが、まだ対応されていない業者もあったので、JavaScript の Base64 変換ライブラリを使用しています。
<JOB>
<SCRIPT language="JScript" src="https://winofsql.jp/base64.js"></SCRIPT>
<SCRIPT language="JScript">

WshShell =  new ActiveXObject("WScript.Shell");

// ファイルを作成して引数で渡しても実行可能
var oExec = WshShell.Exec("\"C:\\pleiades\\xampp\\sendmail\\sendmail.exe\"");

var mail_text = getResource("mail_data");


// 先頭の空白文字列を取り去る
mail_text = mail_text.replace(/^[ \s]+/, "");

// http://logicalerror.seesaa.net/article/151155394.html
var subject = Base64.encode("日本語の表示");

// UTF8 文字列を BASE64 に変換したものをセット
mail_text = mail_text.replace(/--UTF8TEXT--/, subject);

// 本文を渡す
oExec.StdIn.Write( mail_text );

// 標準入力を終了
oExec.StdIn.Write(String.fromCharCode(0x1a));

// 実行が終わるまで待つ
while (oExec.Status != 1) {

	WScript.Sleep(2000);
}
</SCRIPT>
<RESOURCE id="mail_data">
From: a@yourdomain.jp
To: 送り先メールアドレス
Subject: =?utf-8?B?--UTF8TEXT--?=

mail testing

abcdef

あいうえお
</RESOURCE>

</JOB>


base64.js のオリジナルサイト



posted by at 2019-08-22 14:56 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月20日

JScript( WSH ) : Msxml2.ServerXMLHTTP の GET で WEB 上の文字列を取得して JSON オブジェクトに変換して利用する

open Method (ServerXMLHTTP-IServerXMLHTTPRequest)

JSON 文字列を JSON に変換するのは、MDN でも紹介されている eval で行います。

JSON 文字列を送りたい場合は少し面倒ですが、受け側を自作できるのならば他に代替え方法はいくらでも可能です( どうしても必要ならば ポリフィル 使えばいいと思います )。

URL エンコードは encodeURIComponent で行います。
var cond = "name=" + encodeURIComponent("田");
srvXmlHttp.open("GET", "https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php?" + cond, false);
<JOB>
<SCRIPT language="JScript">
// ************************************
// cscript.exe での実行を強制
// ※ 一覧表示の為
// ************************************
str = WScript.FullName;
str = str.substr( str.length - 11, 11 );
str = str.toUpperCase();
if ( str != "CSCRIPT.EXE" ) {
	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c cscript.exe \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

// ************************************
// タイムアウト設定用データ
// ※ デフォルトでも特に問題なし
// ( setTimeouts なし )
// ************************************
var lResolve = 60;
var lConnect = 60;
var lSend = 30;
var lReceive = 30;

// ************************************
// HTTP( GET )
// ※ syain_api_bind.php は utf-8
// ※ open の false は同期処理
// ************************************
var srvXmlHttp;
srvXmlHttp = new ActiveXObject("Msxml2.ServerXMLHTTP.3.0");
srvXmlHttp.open("GET", "https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php", false);
srvXmlHttp.setTimeouts(lResolve, lConnect, lSend, lReceive);
srvXmlHttp.send();

// ************************************
// JSONフォーマットのテキスト
// ************************************
var text = srvXmlHttp.responseText;

// ************************************
// text を JSON オブジェクトに変更
// ************************************
var json = eval('(' + text + ')');

// ************************************
// 氏名部分を表示
// ************************************
for( i = 0; i < json.length; i++ ) {
	WScript.Echo( json[i]["氏名"] );
}

</SCRIPT>
</JOB>


関連する記事

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



posted by at 2019-08-20 00:11 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月18日

JScript( WSH ) で MsgBox と InputBox を使う

相互に呼び出し可能ですが、メインとなるほうを下に定義するのが経験則的に間違いがありません。
( つまり、メインに無い機能は先に関数として定義しておく )

<JOB>
<SCRIPT language="VBScript">
function input_box( title )

	input_box = InputBox( title )

end function
function msg_box( message )

	MsgBox( message )

end function
</SCRIPT>
<SCRIPT language="JScript">

var text = input_box("入力してください")
if ( typeof( text ) == "undefined" ) {
	WScript.Echo( "キャンセルされました" );
	WScript.Quit()
}

msg_box( text + " が入力されました" )

</SCRIPT>
</JOB>




posted by at 2019-08-18 19:19 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月16日

WSH( JScript ) : MySQL から Excel へエクスポート ( Microsoft.ACE.OLEDB.12.0 接続 )

テストした環境では、MySQL の ODBC ドライバは 32 ビットしかないので、SysWOW64\cscript.exe を使用する必要があります

<JOB>
<SCRIPT language="JScript">
// ****************************
// SysWOW64\cscript.exe を使用
// ****************************
str = WScript.FullName;
if ( str.search(/syswow/i) == -1 ) {

	shell = new ActiveXObject("Shell.Application");
	folder = shell.Namespace( 0x29 );
	folderItem = folder.Self;
	target_path = folderItem.Path;

	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c " + target_path + "\\cscript.exe \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

// ****************************
// オブジェクト作成
// ****************************
var cn = new ActiveXObject( "ADODB.Connection" )

// ****************************
// 接続用の文字列を準備
// ****************************
var file_path1_accdb = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb";
var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path1_accdb + ";";

// ****************************
// エクスポート用の文字列を準備
// ****************************
var import_target = "[ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=]";
var target_name = "社員マスタ";
var file_path_xlsx = "C:\\Users\\sworc\\Documents\\hanbaic-set\\new.xlsx";
var export_target = "[Excel 12.0 xml;DATABASE=" + file_path_xlsx +"]";
var export_query = "select * into " + export_target + "." + target_name + " from " + import_target + "." + target_name;

WScript.Echo( export_query );

// ****************************
// エクスポート
// ****************************
cn.Open( connection_string );
cn.Execute( export_query );
cn.Close();

WScript.Echo( target_name + " の Excel へのエクスポート処理が終了しました" );

</SCRIPT>
</JOB>





posted by at 2019-08-16 18:04 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月15日

WSH( JScript ) : .accdb より Excel へのエクスポート

★ 主キーはあとから作成する必要があります。
★ 主キー作成しなければ、insert 〜 select で重複したデータを追加する事ができます

<JOB>
<SCRIPT language="JScript">
// ****************************
// オブジェクト作成
// ****************************
var cn = new ActiveXObject( "ADODB.Connection" )

// ****************************
// 接続用の文字列を準備
// ****************************
var file_path1_accdb = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb";
var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path1_accdb + ";";

// ****************************
// エクスポート用の文字列を準備
// ****************************
var target_name = "社員マスタ";
var file_path_xlsx = "C:\\Users\\sworc\\Documents\\hanbaic-set\\new.xlsx";
var export_target = "[Excel 12.0 xml;DATABASE=" + file_path_xlsx +"]";
var export_query = "select * into " + export_target + "." + target_name + " from " + target_name;

// ****************************
// エクスポート
// ****************************
cn.Open( connection_string );
cn.Execute( export_query );
cn.Close();

WScript.Echo( target_name + " の Excel へのエクスポート処理が終了しました" );

</SCRIPT>
</JOB>




posted by at 2019-08-15 17:18 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

WSH( JScript ) の基本

拡張子を js にして、SCRIPT 要素内のみでも実行可能です。
但しその場合は、オブジェクトは new ActiveXObject で作成しておくと 他(IE11/HTA)へ 転用しやすくなります。

<JOB>
<OBJECT id="objShell" progid="Shell.Application" />
<SCRIPT language="JScript">
// OBJECT 要素を使用しない場合は以下
// var objShell = new ActiveXObject("Shell.Application"); // タイプ1
// var objShell = WScript.CreateObject("Shell.Application"); // タイプ2

objShell.ShutdownWindows();
</SCRIPT>
</JOB>


<JOB>
<OBJECT id="objShell" progid="Shell.Application" />
<SCRIPT language="JScript">
// OBJECT 要素を使用しない場合は以下
// var objShell = new ActiveXObject("Shell.Application"); // タイプ1
// var objShell = WScript.CreateObject("Shell.Application"); // タイプ2

objShell.FileRun();
</SCRIPT>
</JOB>


<JOB>
<SCRIPT language="JScript">
str = WScript.FullName;
str = str.substr( str.length - 11, 11 );
str = str.toUpperCase();
if ( str != "CSCRIPT.EXE" ) {
	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c cscript.exe \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

WScript.Echo();
WScript.Echo("表示");
WScript.Echo("5000ミリ秒停止");

WScript.Sleep(5000);

WScript.Echo("終了します");
WScript.Quit();

</SCRIPT>
</JOB>





posted by at 2019-08-15 16:50 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

WSH(JScript) + Excel : 名前の定義がされた範囲をテーブルとして SELECT 文で 標準出力に CSV 出力

▼ CSV を作成するには以下のようにコマンドプロンプトで実行します。
cscript //nologo read-excel12-ado.wsf > table.csv 
★ テスト実行は、エクスプローラより実行します。 ★ .xls でも動作します read-excel12-ado.wsf
<JOB>
<SCRIPT language="JScript">

str = WScript.FullName;
str = str.substr( str.length - 11, 11 );
str = str.toUpperCase();
if ( str != "CSCRIPT.EXE" ) {
	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c cscript.exe //Nologo \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

// ****************************
// オブジェクト作成
// ****************************
var cn = new ActiveXObject( "ADODB.Connection" )
var rs = new ActiveXObject( "ADODB.Recordset" )

var file_path = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.xlsx";
var target_name = "社員マスタ";

// ****************************
// 接続用の文字列を準備
// ****************************
var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"";

// ****************************
// 接続
// ****************************
cn.Open( connection_string );

// ****************************
// レコードセット取得
// ****************************
query = "select * from " + target_name;
rs.Open( query, cn );

// ****************************
// タイトル出力
// ****************************
var line_buffer = "";
for( i = 0; i < rs.Fields.Count; i++ ) {
	if ( line_buffer != "" ) {
		line_buffer += ",";
	}
	line_buffer += rs.Fields(i).Name;
}
WScript.echo( line_buffer );

// ****************************
// データ出力
// ****************************
while( !rs.EOF ) {
	line_buffer = "";
	if ( line_buffer != "" ) {
		line_buffer += ",";
	}
	for( i = 0; i < rs.Fields.Count; i++ ) {
		if ( line_buffer != "" ) {
			line_buffer += ",";
		}
		line_buffer += rs.Fields(i).Value;
	}
	WScript.echo( line_buffer );

	rs.MoveNext();
}

// ****************************
// レコードセットクローズ
// ****************************
rs.Close();

// ****************************
// 接続解除
// ****************************
cn.Close();

</SCRIPT>
</JOB>




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

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

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

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

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


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

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

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

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

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