SQLの窓

2014年10月17日


PowerShell2.0 : PowerShell 内で VBのコードを記述(TKMP.dllを使用)して、exe を作成した後実行してメールを送信する

PowerShell2.0 内で VB や C# のコードをヒアドキュメントで記述してビルドして exe を簡単に作成できます

.NET用メール送受信クラスライブラリ (TKMP.DLL)

ライブラリ単体 (TKMPDLL_3.1.4.zip) をダウンロードして適当な場所で解凍してそのまま使います。実行ファイルは、解凍した TKMPDLL_3.1.4 フォルダに作成して、実行後削除します。

参考資料

 PowerShell2.0 : VB.net と C# のコードをビルドして exe を作成する

ここでは、vb を使用していますが、c# でも同じです。

vbc.exe でビルドするのとさほど変わりはありませんが、vbc.exe のパスを気にしないでいいところが簡単になります。
$source = @"
Imports TKMP.Writer
Imports TKMP.Net
Public Class Module1

	Public Shared Sub Main()

		'------------------------------------------------------
		'サーバー情報
		'------------------------------------------------------
		Dim Server As String = "ユーザID.sakura.ne.jp"
		Dim ServerPort As Integer = 587

		'------------------------------------------------------
		'メール情報の作成
		'------------------------------------------------------
		Dim mail As MailWriter = New MailWriter

		'差出人
		mail.FromAddress = "メールユーザ@ユーザID.sakura.ne.jp"
		'あて先
		mail.ToAddressList.Add("あて先メールアドレス")
		'本文のクラスを作成します
		Dim part As TextPart = New TextPart("本文")
		'送信メールクラスに本文を登録
		mail.MainPart = part

		'相手のメーラーで「差出人」として表示
		mail.Headers.Add("From", "わたし <メールユーザ@ユーザID.sakura.ne.jp>")
		'相手のメーラーで「あて先」として表示されます
		mail.Headers.Add("To", "あなた <あて先メールアドレス>")
		'メールの件名
		mail.Headers.Add("Subject", "タイトル")
		'付加情報など
		mail.Headers.Add("X-Mailer", "TKMP Version 3.1.4")

		'------------------------------------------------------
		'サーバーへ接続
		'------------------------------------------------------
		'SMTPサーバーを利用する場合に認証が必要なときは以下のようにインスタンスを作成します
		Dim logon As AuthLogin = New AuthLogin("認証用ユーザ文字列", "パスワード")
		Dim smtp As SmtpClient = New SmtpClient(Server, ServerPort, logon)

		'接続
		If Not smtp.Connect() Then
			System.Console.WriteLine("接続に失敗しました。")
			Return
		End If

		'------------------------------------------------------
		'メール送信を開始します
		'------------------------------------------------------
		smtp.SendMail(mail)

		'------------------------------------------------------
		'サーバーから切断します
		'------------------------------------------------------
		smtp.Close()

		System.Console.WriteLine("メールを送信しました")


	End Sub

End Class
"@
Add-Type `
   -TypeDefinition $source `
   -Language VisualBasic `
   -ReferencedAssemblies C:\user\TKMPDLL_3.1.4\TKMP.dll `
   -OutputAssembly C:\user\TKMPDLL_3.1.4\_mail_action.exe `
   -OutputType ConsoleApplication

C:\user\TKMPDLL_3.1.4\_mail_action.exe
Remove-Item C:\user\TKMPDLL_3.1.4\_mail_action.*

履歴
2010-04-06 : 初回投稿

関連する記事

PowerShell2.0 : PowerShell のコードだけで TKMP.dll を使用してメールを送信する


タグ:PowerShell
posted by lightbox at 2014-10-17 13:39 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年10月09日


PowerShell で PNG 画像にフォントを指定してテキストを書き込む

処理前



処理後



メソッドに引数を渡す場合、いったん変数に値をセットするとデータ型が確定するようで、オーバーロードのあいまいさが回避されました。
Add-Type -AssemblyName System.Drawing

# 読込み
$bmp = New-Object System.Drawing.Bitmap -ArgumentList "C:\user\lightbox\vs\button.png"
$gra = [System.Drawing.Graphics]::FromImage($bmp)

# フォント作成
$ff = New-Object System.Drawing.FontFamily -ArgumentList "メイリオ"
$type = [System.Drawing.FontStyle]::Regular
$myFont = New-Object System.Drawing.Font -ArgumentList $ff,32,$type

# ブラシ作成
$col = [System.Drawing.Color]::FromArgb(255,255,255)
$myBrush = New-Object System.Drawing.SolidBrush -ArgumentList $col

# アンチエイリアス設定
$gra.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAliasGridFit

# 書き込み
$gra.DrawString( "送信ボタン", $myFont, $myBrush, 70, 20 )

# 保存
$bmp.Save("C:\user\lightbox\vs\button_edit1.png", [System.Drawing.Imaging.ImageFormat]::Png)

$bmp.Dispose()


▼ C# でのコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Text;

namespace bitmap_test {
	class Program {
		static void Main(string[] args) {

			Bitmap bmp = new Bitmap(@"C:\user\lightbox\vs\button.png");

			Graphics gra = Graphics.FromImage(bmp);

			Font myFont = new Font(
				new FontFamily("メイリオ"),
				32,
				FontStyle.Regular);

			SolidBrush myBrush = new SolidBrush(Color.FromArgb(255,255,255));

			gra.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

			gra.DrawString( "送信ボタン", myFont, myBrush, 70, 20 );

			bmp.Save(@"C:\user\lightbox\vs\button_edit1.png", System.Drawing.Imaging.ImageFormat.Png);

			bmp.Dispose();

		}
	}
}



タグ:PowerShell
posted by lightbox at 2014-10-09 01:22 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年10月07日


PowerShell で、SQLServer2012 の SMO を使用してテーブルの create 用のスクリプトを出力する

思い立ってから、完成するまでに1日かかりました。すこしづづ情報を集めてやっとという感じです。最初に C# で動作確認し、その後 PowerShell に移植しました。

びっくりしたのは、サーバーにパスワード等で接続しなくても、ローカルの SQLExpress を参照可能だったというところです。

Add-Type の参照部分では、SQLServer のバージョンによってファイルが変わる可能性があり、それに関するトラブルを多く見かけました。最初、単純に Table オブジェクトからスクリプトを作成しようとしたのですが、どうしてもうまく行かず、Scripter を使うコードにぶちあたって、いとも簡単に出力できました。

ただ、その際に Framework のオブジェクトの配列が必要だったので、そこでも少し調査に時間がかかりました。

で、結局出力されたのは以下のような UTF-8N のテキストファイルです。
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[社員マスタ](
	[社員コード] [varchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[氏名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[フリガナ] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[所属] [varchar](4) COLLATE Japanese_CI_AS NULL,
	[性別] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[給与] [int] NULL,
	[手当] [int] NULL,
	[管理者] [varchar](4) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

▼ PowerShell のコード
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll"
$srv = New-Object Microsoft.SqlServer.Management.Smo.Server

$db = $srv.Databases["lightbox"]
$scrp = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv)
$scrp.Options.ScriptDrops = $false
$scrp.Options.WithDependencies = $true
$smoObjects = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] -ArgumentList 1
$smoObjects[0] = $db.Tables["社員マスタ"].Urn
$sc = $scrp.Script($smoObjects)

$srv.ConnectionContext.Disconnect()

$ftext = New-Object System.IO.StreamWriter -ArgumentList "C:\user\script.txt"

foreach($text in $sc){
  $ftext.WriteLine( $text )
}

$ftext.Close()


C# で同等の処理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Sdk.Sfc;

namespace smo_table_script
{
	class Program
	{
		static void Main(string[] args)
		{
			Server srv = new Server();

			Database db = srv.Databases["lightbox"];
			Scripter scrp = new Scripter(srv);
			scrp.Options.ScriptDrops = false;
			scrp.Options.WithDependencies = true;

			Urn[] smoObjects = new Urn[1];
			smoObjects[0] = db.Tables["社員マスタ"].Urn;

			StringCollection sc = scrp.Script(smoObjects);
			foreach (string st in sc)
			{
				Console.WriteLine(st);
			}

			Console.ReadLine();
		}
	}
}




posted by lightbox at 2014-10-07 22:00 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年07月30日


PowerShell より New-Object で .NET Framework を使って簡単にバイナリファイルをアップロードする

New-Object を使うのは、インスタンス作成の為です。コンストラクタに引き渡す為に使用します。その為に、-ArgumentList を使用しますが、[IO.FileMode]::Open 等の定数を使用する場合に直接指定するとエラーになったので、一旦変数にセットして使用しています。

定数の値が知りたい場合は、[IO.FileMode]::Open.value__ で表示されました。そして、[IO.FileMode]::Open という使用方法は、静的なクラスとメソッドの使用方法です。

冒頭の、HttpWebRequest インスタンスの作成でも使用しています。
# ****************************
# HttpWebRequest インスタンス
# ****************************
$myReq = [Net.WebRequest]::Create("http://yourdomain/put/put.php")
$myReq = [Net.HttpWebRequest]$myReq

# ****************************
# FileStream インスタンス
# ****************************
$FileMode = [IO.FileMode]::Open
$FileAccess = [IO.FileAccess]::Read
$fs = New-Object IO.FileStream -ArgumentList "C:\\user\\winofsql.png",$FileMode,$FileAccess
$length = $fs.Length

# ****************************
# バイト配列の作成
# ****************************
[byte[]]$data = New-Object byte[] $length
# ****************************
# 読み込み
# ****************************
$fs.Read($data, 0, $length)
$fs.Close()

# ****************************
# 送信準備
# ****************************
$myReq.Method = "POST"
$myReq.ContentLength = $length

# ****************************
# データを書き込む
# ****************************
$reqStream = $myReq.GetRequestStream()
$reqStream.Write($data, 0, $length)
$reqStream.Close()

# ****************************
# 結果を取得
# ****************************
$myRes = $myReq.GetResponse()
$resStream = $myRes.GetResponseStream()
$sr = New-Object IO.StreamReader -ArgumentList $resStream, [Encoding]::UTF8
$sr.ReadToEnd() # この行で表示
$sr.Close()



関連する記事


posted by lightbox at 2014-07-30 15:18 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年07月29日


PowerShell より COM オブジェクトを使用して、簡単にバイナリファイルをアップロードする

PHP の簡単なコードへ向けて、データをアップロードします。PHP のコードや、VBScript で書いたアップロードのコードは、『VBscript(または JScript) で簡単にバイナリファイルをアップロードする』を参照して下さい。

Microsoft のドキュメントにおける、COM オブジェクトの作成については、『.NET オブジェクトと COM オブジェクトの作成 』を参照して下さい。

PowerShell における特殊な変数については、『about_automatic_variables』を参照して下さい

PowerShell のソースコード
$objHTTP = New-Object -ComObject Msxml2.ServerXMLHTTP
$Stream = New-Object -ComObject ADODB.Stream

$objHTTP.open( "POST","http://yourdomain/put/put.php", $False )

$Stream.Open()
$Stream.Type = 1
$Stream.LoadFromFile("C:\\user\\winofsql1.png")
$nLen = $Stream.Size
$data = $Stream.Read($nLen)

$objHTTP.setRequestHeader("Content-Length",$nLen)
$objHTTP.send($data)

$objHTTP.responseText


関連する記事


タグ:PowerShell
posted by lightbox at 2014-07-29 13:54 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年07月17日


PowerShell2.0 : here-string と呼ばれるヒアドキュメント( here-string )の構文

get-help about_Quoting_Rules で表示されます。
( または、IE 上で 『mk:@MSITStore:C:\Windows\help\mui\0411\WindowsPowerShellHelp.chm::/html/cec5ab07-223d-4269-9362-d30c54a95193.htm』)

" の内部で $で始まる変数を書くと内容に置き換えられます。( PowerShell では here-string と表記されていますが、一般的なヒアドキュメントと同じです。 )

' の内部ではそのままの表記で再現されます

<Enter> は改行を意味するマニュアル用の表記方法です

要するに、@ 〜 @ の間を改行も含めて文字列として扱いましょうというものです。
形式 1:

  @"<Enter>
    <string> [string] ...<Enter>
  "@


形式 2:

  @'<Enter>
    <string> [string] ...<Enter>
  '@


どちらの形式でも、終わりの引用符を行の最初の文字にする必要があります。

(使用例)

$message = @"
Out-Host はコマンドの規定値なので、
文字列のみを記述するとそののまま表示されます。
"@

$message

一般的に、ヒアドキュメント内では、言語上のエスケープ等を気にせずに文字列を扱えるという特性があります


タグ:PowerShell
posted by lightbox at 2014-07-17 14:38 | PowerShell | このブログの読者になる | 更新情報をチェックする
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 終わり