SQLの窓

2018年05月21日


PowerShell で System.Data.Odbc を使用して MySQL のデータを一覧表示( csv )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
どう考えても、C# で書いたほうが一般的で使いやすい気もします( using したいし )が、一応 PowerShell だけで書いてみました。特に配列の扱いが分かりにくいので最初苦労しましたが、要素数の初期化が無さそうなので、0..10 として後から文字列をセットしています。 PowerShell を使用して、C# のコンソールアプリ用のソースコードから exe を作成する ▼ PowerShell ドキュメント about_Arrays( 配列 ) get_records.ps1
$connection = New-Object System.Data.Odbc.OdbcConnection
$command = New-Object System.Data.Odbc.OdbcCommand
$builder = New-Object System.Data.Odbc.OdbcConnectionStringBuilder

$builder.Driver = "MySQL ODBC 5.3 Unicode Driver"
 
# 接続用のパラメータを追加
$builder.Add("SERVER", "localhost");
$builder.Add("DATABASE", "lightbox");
$builder.Add("UID", "root");
$builder.Add("PWD", "");

# 内容表示( 接続文字列 )
$builder.ConnectionString

# 接続文字列設定
$connection.ConnectionString = $builder.ConnectionString

# *********************
# 接続
# *********************
try {
	# 接続文字列を使用して接続
	$connection.Open()
	# コマンドオブジェクトに接続をセット
	$command.Connection = $connection
	# コマンドを通常 SQL用に変更
	$command.CommandType = [System.Data.CommandType]::Text
}
catch [Exception] {
 
	$error[0] | Format-List * -force
	$connection.Close()

	$command.Dispose()
	$connection.Dispose()
	exit
 
}

# *********************
# 実行 SQL
# *********************
$command.CommandText = "select * from 社員マスタ"

# *********************
# レコードセット取得
# *********************
try {
	$reader = $command.ExecuteReader()
}
catch [Exception] {
 
	$error[0] | Format-List * -force
	$connection.Close()

	$command.Dispose()
	$connection.Dispose()
	exit
 
}

$out_format = "{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}"

while($reader.Read()) {

	$array = 0..10
	for($idx=0; $idx -le 10; $idx++) {
		$array[$idx] = $reader.GetValue($idx).ToString()
	}

	$out_format -f 
		$array[0],
		$array[1],
		$array[2],
		$array[3],
		$array[4],
		$array[5],
		$array[6],
		$array[7],
		$array[8],
		$array[9],
		$array[10]

}

$reader.Close()

# 接続解除
$connection.Close()

# 解放
$reader.Dispose()
$command.Dispose()
$connection.Dispose()


関連する記事

Pleiades Oxygen 2 の XAMPP 内の MySQL を利用可能にしてテストデータ(販売管理)を登録する






posted by lightbox at 2018-05-21 22:50 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年05月20日


PowerShell を使用して、C# のコンソールアプリ用のソースコードから exe を作成する( WebClient で wget.exe )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
vb からも作成できます。拡張子を .vb でソースを作成して差し替えれば使えます。 wget.cs 第一引数に渡した URL をダウンロードします。 Environment.GetCommandLineArgs() の結果には、自分自身が含まれています。 よって、param[1] と args[0] が同じ内容になります。 Visual Studio で追加参照が必要なクラスが -ReferencedAssemblies の対象です
using System;
using System.IO;
using System.Net;
using System.Web;
using System.Windows.Forms;

class Program
{
	static void Main(string[] args)
	{
		string[] param = Environment.GetCommandLineArgs();
		if (param.Length > 1)
		{
			Console.WriteLine( string.Format("第一引数 : {0}", param[1]) );
			Console.WriteLine(string.Format("第一引数 : {0}", args[0]));
		}
		else
		{
			MessageBox.Show("ダウンロードする URL を引数に指定して下さい");
			Environment.Exit(0);
		}

		string localFileName = Path.GetFileName(param[1]);
		Console.WriteLine(string.Format("ファイル名 : {0}", localFileName));

		WebClient wc = new WebClient();
		wc.DownloadFile( param[1], localFileName );
		wc.Dispose();

		// *******************************************
		// -ReferencedAssemblies の複数テスト用
		// *******************************************
		string percent_encoding = HttpUtility.UrlEncode(param[1]);
		Console.WriteLine( percent_encoding );

		MessageBox.Show("処理が終了しました");

	}
}


MessageBox.Show
HttpUtility.UrlEncode

ビルド用 wget.ps1
Add-Type -path "wget.cs" `
	-ReferencedAssemblies System.Web, System.Windows.Forms `
	-OutputAssembly my_wget.exe `
	-OutputType ConsoleApplication

Read-Host "何かキーを押してください"

wget.cs は、wget.ps1 と同じフォルダにあります
 ` で継続行指定です。
System.Web, System.Windows.Forms という感じで複数の指定を行っています

▼ 実行用バッチファイルのサンプル
my_wget.exe http://winofsql.jp/image/planet.jpg
▼ 実行結果の表示
C:\user\ps\cs>my_wget.exe http://winofsql.jp/image/planet.jpg
第一引数 : http://winofsql.jp/image/planet.jpg
第一引数 : http://winofsql.jp/image/planet.jpg
ファイル名 : planet.jpg
http%3a%2f%2fwinofsql.jp%2fimage%2fplanet.jpg
この後、メッセージボックスが表示されます 関連するドキュメント Read-Host コマンドレットの使用 Add-Type
posted by lightbox at 2018-05-20 19:33 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年04月10日


PowerShell : COM 経由(New-Object) + MySQL Connector/ODBC でループ処理をしながら更新

PowerShell をコマンドプロンプトからセキュリティの制限を回避して実行できるように以下のバッチファイルを Windows フォルダに置いています。

▼ ps.bat
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
これによって、カレントフォルダの .ps1 スクリプトファイルを名前を指定して実行できます。 ado_com_mysql.ps1 データベースから条件に合ったレコードを読みだして、CSV 形式で出力する為のテキストを作成して最後に出力します。 その処理中にレコード毎に更新を行っています。 CSV 形式のカンマは、常に項目の後ろに追加して、行が完成した後一文字を行の最後から削除して作成しています。( いわゆる Chop です ) ここでは、その為に $line.Substring(0,$line.Length-1) を実行しています。 Hey, Scripting Guy! Blog では、正規表現による置換を使った方法も紹介されています。 $error[0] | Format-List * -force は、$error の中のプロパティと内容を全て表示する方法です。 ▼ 参考 How to list all properties of a Powershell object? 実行はコマンドプロンプトから ps ado_com_mysql となります
$cn = New-Object -ComObject ADODB.Connection
$rs = New-Object -ComObject ADODB.Recordset

$driver = "{MySQL ODBC 5.3 Unicode Driver}"
$server = "localhost"
$db = "lightbox"
$user = "root"
$pass = ""

$connectionString = "Provider=MSDASQL;Driver={0};Server={1};DATABASE={2};UID={3};PWD={4};"
$connectionString = $connectionString -f $driver,$server,$db,$user,$pass

$connectionString


try {
	$cn.Open( $connectionString )
}
catch [Exception] {

	$error[0] | Format-List * -force
	exit

}

$rs.CursorType = 2
$rs.LockType = 3
$rs.Open( "select * from 社員マスタ where 社員コード <= '0004' ", $cn )

$text = ""
while( !$rs.EOF ) {

	$line = ""

	$line += "{0}{1}" -f $rs.Fields("社員コード").Value, ","
	$line += "{0}{1}" -f $rs.Fields("氏名").Value, ","
	$line += "{0}{1}" -f $rs.Fields("フリガナ").Value, ","
	$line += "{0}{1}" -f $rs.Fields("所属").Value, ","
	$line += "{0}{1}" -f $rs.Fields("性別").Value.ToString(), ","
	$line += "{0}{1}" -f $rs.Fields("給与").Value.ToString(), ","
	$line += "{0}{1}" -f $rs.Fields("手当").Value.ToString(), ","
	$line += "{0}{1}" -f $rs.Fields("管理者").Value, ","
	$line += "{0}{1}" -f $rs.Fields("作成日").Value.ToString("yyyy/MM/dd"), ","
	$line += "{0}{1}" -f $rs.Fields("更新日").Value.ToString("yyyy/MM/dd"), ","
	$line += "{0}{1}" -f $rs.Fields("生年月日").Value.ToString("yyyy/MM/dd"), ","

	$line = $line.Substring(0,$line.Length-1)

	$line += "`n"
	$text += $line

	$rs.Fields("管理者").Value = "0001"
	$rs.Update()

	$rs.MoveNext()
}

$text

if ( $cn.State -ge 1 ) {
	$cn.Close()
}



関連する記事

▼ Python + COM
Eclipse + Python(Pydev) : pywin32(COM使用の為) + MySQL Connector/ODBC でループ処理をしながら更新

▼ Ruby + COM
Eclipse + Ruby : win32ole(COM使用の為) + MySQL Connector/ODBC でループ処理をしながら更新



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

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

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

powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1

▼ コマンドラインが長いので ps.bat を Windows フォルダに作成しておきます
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
※ カレントフォルダで ./ と 拡張子なしで実行できます。 ※ SHIFT キーを押しながらフォルダを右クリックで PowerShell ウインドウが開くので cmd と入力後使用します。 ファイルリストを \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-04-10 16:11 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年02月16日


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
▼ Windows7 用
powershell -Sta -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 | PowerShell | このブログの読者になる | 更新情報をチェックする

2014年10月18日


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

関連する記事

PowerShell2.0 : PowerShell 内で VBのコードを記述(TKMP.dllを使用)してメールを送信する

VB.net のコードを埋め込むと、いったんビルドしないと動かなかったですが、Add-Type で TKMP.dll をロードして使うとあっさり動きました。以前はFramework のクラスとメソッドでロードしていたみたいですが、Add-Type でたいてい簡単にアセンブリを使えるように設計されているようです。

TKMP.dll を最初にテストした 2010年4月では、TKMP.dll のバージョンは、2.0.0 でしたが、現在は 3.1.4 です。

▼ DLL ダウンロード
.NET用メール送受信クラスライブラリ (TKMP.DLL)
Add-Type -Path "C:\user\TKMPDLL_3.1.4\TKMP.dll"

$mail = New-Object TKMP.Writer.MailWriter

$ToAddress = "宛先メールアドレス"

# 差出人
$mail.FromAddress = "差出人メールアドレス"
# あて先
$mail.ToAddressList.Add($ToAddress)
# 本文のクラスを作成します
$part = New-Object TKMP.Writer.TextPart("本文`n本文")
#送信メールクラスに本文を登録
$mail.MainPart = $part


# 相手のメーラーで「差出人」として表示
$mail.Headers.Add("From", "わたし <$($mail.FromAddress)>")
# 相手のメーラーで「あて先」として表示されます
$mail.Headers.Add("To", "あなた <$ToAddress>")
# メールの件名
$mail.Headers.Add("Subject", "タイトル")
# 付加情報など
$mail.Headers.Add("X-Mailer", "TKMP Version 3.1.4")

# サーバーへ接続
#------------------------------------------------------
# SMTPサーバーを利用する場合に認証が必要なときは以下のようにインスタンスを作成します
$logon = New-Object TKMP.Net.AuthLogin($mail.FromAddress, "パスワード")
$smtp  = New-Object TKMP.Net.SmtpClient("SMTPサーバー", 587, $logon)

# 接続
if ( $smtp.Connect() -eq $false ) {
	"接続に失敗しました。"
}
else {
	$smtp.SendMail($mail)
	"メールを送信しました"
}

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




posted by lightbox at 2014-10-18 17:00 | 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 ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり