SQLの窓

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

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

PowerShell2.0 : 初めての PowerShell / ファイルのダウンロード (.NET Framework の利用)

Windows7 では PowerShell はデフォルトで利用できます。ですが、基本的には .NET Framework を利用したりするので一般的ではありません。プログラマ向きの面倒なものです。

PowerShell2.0 : 最初の設定( set-executionpolicy remotesigned の実行 )

特に、言語マニュアルというものがあるのでは無く、ヘルプから 『Windows PowerShell の About ヘルプ トピック』という解りにくところから探して行きます(本文のサンプルコードを参考にしていきます)。

ヘルプは、Windows ベースのグラフィック ユーザー インターフェイスでコマンドの実行ができる『Windows PowerShell ISE』から呼び出します



以下は、about_Automatic_Variables と言って、状態情報を格納する変数について書かれています。True や  False や Null はここにありますが他にもいろいろな値が用意されています

about_Automatic_Variables
(日本語テキストが必要な場合は、get-help about_Automatic_Variables > about_Automatic_Variables.txt を実行します)

(例)

$NULL
	NULL または空の値を格納します。文字列 "NULL" の代わりにこの変数
	を使用して、コマンドおよびスクリプトで NULL を表すことができます。
	空でない文字列またはゼロ以外の整数に変換されると、この文字列は
	TRUE として解釈されます。


また、以下は get-help Add-Type -full に書かれているサンプルを元にテストした、ファイルをダウンロードする為の二種類の簡単なコードです。後者は GUI のダウンロード進捗を示すダイアログが表示されます。

※ 前者はこちら
$obj = New-Object System.Net.WebClient
$obj.DownloadFile("http://winofsql.jp/image/winofsql.png", "C:\user\work\data\winofsql1.png")
$obj.Dispose()

▼ 6000 は、タイムアウト間隔 (ミリ秒単位)。 既定値は 100 秒です。
add-type -AssemblyName Microsoft.VisualBasic
$obj = New-Object Microsoft.VisualBasic.Devices.Network
$obj.DownloadFile(
	"http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.0.0-p481.exe?direct",
	"C:\user\work\data\rubyinstaller-2.0.0-p481.exe" ,
	"",
	"",
	$true,
	6000,
	$true 
)

タイムアウトは、指定した connectionTimeout 内にサーバーが応答しない場合に発生します
いずれも、出力ファイルのフォルダに対する権限を保有している必要があります。



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

2014年03月28日


PowerShell2.0 : ファイルを開くダイアログを使う

Hey, Scripting Guy! では、[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") を使う方法が紹介されていますが Add-Type で普通に使えるのでそれでいいと思いますHey, Scripting Guy!

Windows PowerShell を使用して [ファイルを開く] ダイアログ ボックスを開く方法はありますか

これらの情報は、Windows XP の頃の情報で、Windows7 の PowerShell では 以下で示されるコード内の $OpenFileDialog.ShowHelp = $true; によって正しく実行されます( これが無いとダイアログが表示されずに、PowerShell がメモリ上で停止してしまいまいます )

これ以外の方法では、"powershell -Sta -file スクリプト" で実行すると表示されます。
利用する場合は、"powershell -file スクリプト" で実行しないと、powershell 内から .\スクリプト で実行するとダイアログがアクティブにならないので注意です
Add-Type -AssemblyName System.Windows.Forms

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

$OpenFileDialog.initialDirectory = "c:\tmp"

$OpenFileDialog.filter = "All files (*.*)| *.*"

$OpenFileDialog.ShowHelp = $true;

$OpenFileDialog.ShowDialog() | Out-Null

$OpenFileDialog.filename

関連する記事

PowerShell2.0 : 最初の設定



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

2010年04月09日


PowerShell2.0 : イベントの処理とタイマーと、関数と変数のスコープ

.NET のアセンプリのイベント処理を行う為の準備の為のテストです。関数のスコープは、現在のセッションでテストの為に表示するのに必須でした。特別な理由が無い限り運用のスクリプト内の定義はグローバルを意識して定義して処理するのがいいと思います。
# タイマー作成
$timer = New-Object Timers.Timer
# タイマー間隔
$timer.Interval = 500

# タイマーのイベント処理を登録
$job = Register-ObjectEvent `
	-inputObject $timer `
	-eventName Elapsed `
	-sourceIdentifier testEventSample `
	-Action { myTimerFunction }

# タイマーの処理
# 呼び出し側に表示させる為にグローバルスコープとして登録
$counter = 0	# このスクリプトのスコープ
function global:myTimerFunction {
	# このスクリプトのスコープで参照
	$script:counter++
	$str = get-date -uformat %s
	[System.Console]::WriteLine("OK : $counter : $str")
}

# 規定値は false
# タイマー開始
$timer.Enabled = $true


<#

# PowerShellのプロンプトから .ps1 を実行する場合、
# スクリプト内で完結させるにはこの部分を有効にします
# 有効にしない場合は、スクリプト実行後もイベントは継
# 続して実行されます
# その場合イベントを終了するには、unregister-event
# を実行して下さい

# タイマーの処理を表示させる為にこちら側に停止状態
# を連続的に作成
for($i=1;$i -le 20;$i++){
	Start-Sleep -Milliseconds 500
}

# タイマーのイベント処理を削除
unregister-event testEventSample

# 関数を削除
remove-item function:myTimerFunction

#>

"スクリプト終了"




posted by lightbox at 2010-04-09 11:49 | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年04月07日


PowerShell(スクリプト)の引数を格納する配列変数 $args の扱い

$args は配列になるので、文字列に埋め込むには部分式演算子 というものを使います。これは、about_operators で説明されています。

$($args[0]).gettype().fullname は.NET Framework 型を調べていますが、これについては、about_assignment_operators の505行目あたりで説明されています。

"{0},{1}" -f $args[0], $args[1] は、.NET の書式の使い方ですが、これも about_operators にあります。

注意すべきは、引き渡す場合で、配列として区切る為の区切り文字は空白なので、, を使うと一つの引数に配列が格納されます。

----------------------------------------------------
PS C:\ps\test> .\test_002.ps1 a,b
a b,
System.Object[]
System.Object[],
----------------------------------------------------

以下は通常の場合です
----------------------------------------------------
PS C:\ps\test> .\test_002.ps1 a b
a,b
System.String
a,b
----------------------------------------------------
"$($args[0]),$($args[1])"

$($args[0]).gettype().fullname

"{0},{1}" -f $args[0], $args[1]



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

PowerShell2.0 : Shell.Application でディレクトリ内のファイルとディレクトリの個数( .NET の文字列フォーマット )

COM の Shell.Application を単純に使っています。
この例は、Shell の英文マニュアルページに投稿されていたものです。
(Folder.Items Method (Windows))

"Folder `"{0}`" contains {1} items" -f $foldername, $count の
-f は、フォーマット演算子 と呼ばれ、about_operators に
説明があります。(文字列オブジェクトの format メソッドを使用)

※ "Folder `"$foldername`" contains $count items" でも同じ結果になります
# Shell オブジェクトを取得
$shell = new-object -com Shell.Application

# ファイル(またはディレクトリ)数を数える対象のディレクトリ
$foldername = "C:\TEMP"

# フォルダオブジェクト
$folder = $shell.namespace($foldername)

# 正しいフォルダの場合
if ($folder) {
	# ファイル一覧を持つオブジェクトを取得
	$folderitems = $folder.items()
	# 数を取得
	$count = $folderitems.count
	# 表示
	"Folder `"{0}`" contains {1} items" -f $foldername, $count
}



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

2010年03月31日


PowerShell2.0 : PowerShell ISE で Excel のオブジェクトを利用して完全に終了(メモリから解放)させるには

コンソールなら良いのですが、PowerShell 統合スクリプト環境 (ISE)
だと、Windows アプリケーションなので、元となるプロセスが終了しな
いと Excel がプロセスに残ったままになります。

明示的に終了させるには、.NET プログラミングで通常行われる方法で
行いますが、作成したオブジェクトは全て $null をセットする必要が
あるかもしれません

※ 作成したオブジェクト : 少なくとも左辺に置いた変数にセットした場合
$ExcelApp = New-Object -ComObject "Excel.Application"
$ExcelApp.Quit()
$ExcelApp = $null
[System.GC]::Collect([System.GC]::MaxGeneration)
PowerShell2.0 : COM 経由で Excel のグラフを作成した後、
PDFとしてエクスポートする を ISE で実行した場合、以下の処理を
追加するとメモリから解放されました

$ExcelApp = $null
$MyChart = $null
$newChartObject = $null
$dataRange = $null
$chartObjects = $null
$MySheet = $null
$ExcelBook = $null
[System.GC]::Collect([System.GC]::MaxGeneration)
Ps_ise


タグ:PowerShell
posted by lightbox at 2010-03-31 17:40 | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年03月28日


PowerShell2.0 : 全ての日本語ヘルプファイル(テキスト)を作成するスクリプト

このコードを書いた .ps1 ファイルを作成して、エクスプローラで右
クリックして PowerShell で実行を行うと、そのディレクトリに全て
のヘルプファイルを作成します

$help_all = get-help *
$target_name = $help_all | select-object Name
foreach ($str in $target_name)
{
	get-help $str.Name -full > ("_" + $str.Name + ".txt")

}

以下でも同じです。
$help_all = get-help *
foreach ($str in $help_all)
{
	get-help $str.Name -full > ("_" + $str.Name + ".txt")

}

文字列を検索したい場合は、Windows の help ディレクトリにある
WindowsPowerShellHelp.chm を使うといいと思います。


タグ:PowerShell
posted by lightbox at 2010-03-28 16:28 | PowerShell | このブログの読者になる | 更新情報をチェックする

PowerShell2.0 : プロンプトの変更

詳細は、get-help about_Prompts です。デフォルトではパスが表示されるので単純なプロンプトに変更する為に以下のように入力します。
function prompt {">"}

現在のプロンプト関数を表示するには、以下のように入力します

(get-item function:prompt).definition


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

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

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

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

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


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

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

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

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

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


Windows
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり