SQLの窓

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 | このブログの読者になる | 更新情報をチェックする
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 終わり