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

2018年10月19日

PowerShell 内に C# を記述して、SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する

ライブラリを取得する為に、nuget を使用します。

少し参照する dll が多いですが、VisualStudio で実行テストした後 PowerShell に移植しています
$code = @"
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
public class MyClass {

	public static void create_sql() {

		UTF8Encoding UTF8N_Enc = new UTF8Encoding();
		// false は上書き
		StreamWriter WriteFile = new StreamWriter("sqlexpress.sql", false, UTF8N_Enc);

		// サーバー
		Server srv;
		// インスタンス
		srv = new Server();

		// サーバーインスタンスの情報
		srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
		srv.ConnectionContext.LoginSecure = false;
		srv.ConnectionContext.Login = "sa";
		srv.ConnectionContext.Password = "";
		// 接続
		srv.ConnectionContext.Connect();

		// バージョンの表示
		Console.WriteLine(srv.Information.Version);

		// 参考
		Scripter scripter = new Scripter(srv);

		Database myDb = srv.Databases["lightbox"];
		foreach (Table myTable in myDb.Tables)
		{

			StringCollection tableScripts = myTable.Script();
			foreach (string script in tableScripts)
			{
			  WriteFile.WriteLine(script);
			}
		}

		WriteFile.Close();
		WriteFile.Dispose();

		srv.ConnectionContext.Disconnect();


	}
}
"@
Add-Type -Path ("C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.ConnectionInfo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Smo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Management.Sdk.Sfc.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SmoExtended.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SqlEnum.dll")
Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.ConnectionInfo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Smo.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.Management.Sdk.Sfc.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SmoExtended.dll","C:\user\lightbox\nuget\Microsoft.SqlServer.SqlManagementObjects.140.17283.0\lib\net40\Microsoft.SqlServer.SqlEnum.dll")

[MyClass]::create_sql()




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

2018年10月16日

PowerShell 内に、C# を書いて、TKMP.DLL でメール受信

powershell -NoProfile -ExecutionPolicy Unrestricted .\mail_rec.ps1 > log.txt
.NET用メール送受信クラスライブラリ (TKMP.DLL) ▼ さくらインターネットのメールでテストしています mail_rec.ps1
$code = @"
using System;
using TKMP.Net;
using TKMP.Reader;
public class MyClass {
	public static void mail_rec() {

//public class MyClass
//{
//	public static void Main()
//	{
		ImapClient client = null;

		BasicImapLogon logon = new BasicImapLogon("ユーザ@さくらユーザ.sakura.ne.jp", "パスワード");
		client = new ImapClient(logon, "さくらユーザ.sakura.ne.jp", 993);
		client.AuthenticationProtocol = AuthenticationProtocols.SSL;

		try
		{
			if (!client.Connect())
			{
				Console.WriteLine("接続できませんでした");
				return;
			}
		}
		catch (Exception ex)
		{
			Console.WriteLine("接続エラーが発生しました" + ex.Message );
			return;
		}

		// メールデータ一覧を格納するオブジェクト
		IMailData[] mailData = client.GetMailList();

		// データがありません
		if (mailData == null)
		{
			Console.WriteLine("データがありません");
			return;
		}

		int maxCount = 100;
		int mailCounter = 0;

		// メールデータの数
		Console.WriteLine(mailData.Length);

		mailCounter = mailData.Length;
		if (mailCounter < maxCount)
		{
			maxCount = mailCounter;
		}

		// 読込み
		int idx = 0;

		// メールデータを表示するループ
		foreach (var data in mailData)
		{

			idx++;
			if (idx > maxCount)
			{

				break;
			}

			data.ReadBody();

			Console.WriteLine("■■■【" + idx +"開始】------------------------");

			// 本文無し( 本文が必要な場合は、false で、reader.MainText )
			MailReader reader = new MailReader(data.DataStream, false);

			if (reader.FileCount == 0)
			{
				Console.WriteLine("添付ファイルはありません");
			}

			//添付ファイルのコレクションを検査します
			foreach (TKMP.Reader.File file in reader.FileCollection)
			{
				// 保存場所は事前に作成する必要があります
				// (メールとの関連は、アプリケーション側で工夫する必要があります)
				file.FileSave(@"c:\temp\data\");
			}

			// UID ( ユニークなメールのID  )
			// ▼ tkmp リファレンス : http://uwa.potetihouse.com/library/tkmp/document/html/P_TKMP_Net_MailData_Imap_UID.htm
			// この値は各メールデータ毎にユニークであることをサーバーが保証しているので、既読メールの識別にはこの値を使用してください
			Console.WriteLine("UID : " + data.UID);

			// メールサイズ
			Console.WriteLine("サイズ : " + data.Length);

			// 本文( 本来はファイルかデータベースに書きだす )
			Console.WriteLine("▼【本文】------------------------");
			Console.WriteLine(reader.MainText);
			Console.WriteLine("▲【本文】------------------------");

			// ヘッダの一覧より、目的のヘッダを探す
			// http://uwa.potetihouse.com/library/tkmp/document/html/AllMembers_T_TKMP_Reader_Header_HeaderString.htm
			foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection)
			{

				if ( headerdata.Name == "From" || headerdata.Name == "Subject" || headerdata.Name == "Date" ) {
					if (headerdata.Name == "From") {
						Console.WriteLine("【FROM】" + headerdata.Data);
					}
					if (headerdata.Name == "Subject") {
						Console.WriteLine("【件名】" + headerdata.Data);
					}
					if (headerdata.Name == "Date") {
						Console.WriteLine("【日付】" + headerdata.Data);
	
						string target = headerdata.Data;
						target = target.Replace(" (JST)", "");
						target = target.Replace(" (PDT)", "");
						try
						{
							DateTime dt = System.DateTime.ParseExact(target, "ddd, d MMM yyyy HH':'mm':'ss zzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None);
							Console.WriteLine("【編集日付】" + string.Format("{0}", dt));
						}
						catch (Exception ex)
						{
							Console.WriteLine("【変換エラー】" + headerdata.Data);
							Console.WriteLine(headerdata.Data + " はフォーマット変換できませんでした" + ex.Message);
						}
	
					}
				}
				else {
					Console.WriteLine("【" + headerdata.Name + "】=>" + headerdata.Data);
				}

			}

			Console.WriteLine("■■■【" + idx +"終了】------------------------");
			Console.WriteLine("");


		 }

		// 受信終了
		client.Close();


	}
}
"@

$path = "C:\user\dll"
Add-Type -Path ("${path}\TKMP.dll")
Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("${path}\TKMP.dll")

[MyClass]::mail_rec()


関連する記事

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



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

2010年04月07日

PowerShell2.0+TKMP.dllでメール送信



PowerShell2.0 : PowerShell 内で VBのコードを記述(TKMP.dllを使用)してメールを送信する
残念ながら、PowerShell を使って一時的に exe を作る方法でしか実行できませんでした。しかし、exe は正しく作成されるのに、PowerShell のインメモリで実行しようとすると、参照できないファイルがあるというエラーになります。かなりいろいろ試しましたが、どうも解決策が見つからないので無理せずに exe を作成する
事にしました。

実行はできるので、実際問題としてさほど不便は無いと思います。

それにしても不思議な話です。

試してはいませんが、TKMP.dll そのものをロードして、VB.net のコードを使わずに直接使ってメール受信を行っているサイトの記述を見かけたので、そちらなら実行できるかもしれませんが、目的を考えれば VB.net か C# で作っておいたほうが転用( 逆も含めて )できるのでお得だとは思います


・・・といいつつ単独でテストしたくなってやってみたらあっさり動きました。


PowerShell2.0 : PowerShell のコードだけで TKMP.dll を使用してメールを送信する
posted by at 2010-04-07 11:20 | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年03月31日

PowerShell2.0:COM経由のExcel操作

Ps_excel_pdf2
PowerShell2.0 : COM 経由で Excel のグラフを作成した後、PDFとしてエクスポートする
やはり、一筋縄ではうまく動かないので、少し時間がかかりましたが、 get-memeber でスクリプトレベルで利用可能な実際のプロパティやメ ソッドが見れるので、Value2 というプロパティを使ったらセルへ転送 できました。その他 Cells が使えなかったので Range で処理してい ます。 関連する記事 PowerShell2.0 で Framework アプリケーションや Win32APIアプリケーションや COM を使ったアプリケーションを作成する
posted by at 2010-03-31 13:46 | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年03月29日

PowerShell2.0でFrameworkアプリケーションやWin32APIアプリケーションやCOMを使ったアプリケーションを作成する



プログラマの方であれば、以下の3例で何ができるかは想像が付くと思いますが、
PowerShell だけでもアプリケーションとなるので、手の届かないところは無い
といったお宝ではありますが、情報の確認は PowerShell2.0 のヘルプシステム
を3分で作成する で作成されるヘルプテキストに集約したほうが良いと思います。
今回、WEB も調査したみましたが、ヘルプテキストに勝る情報は見つける事が
できませんでしたので。

以下にCOM のサンプルは今ありませんが、Add-Type のヘルプでは同じだと言う
事だったのでいずれ追加します。

PowerShell2.0 : here-string(VB.net) で EnumWindows(Win32API) の実行
PowerShell2.0 : VB.net のフォームを呼び出して入力値を得る
PowerShell2.0 : VB.net と C# のコードをビルドして exe を作成する


関連する記事

PowerShell2.0 : 状態情報を格納する変数(定義済の定数のように使われるものが
含まれます)と .NET Framework の利用
PowerShell2.0 : here-string と呼ばれるヒアドキュメントの構文
PowerShell2.0 : .NET Framework のスタティックメソッドの実行
PowerShell2.0 : プロンプトの変更


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

2010年03月28日

PowerShell2.0のヘルプシステムを3分で作成する

PowerShell のヘルプはそのままでは参照が面倒です。せっかく日本語で
ていねいに説明されているのに、宝の持ちぐされなので3分で作ってしまいましょう。

MKEditor を使って以下のようにインデックスで見れます。
Ps_help

まず、以下のページから create_help.ps1 を作って実行します。
そうすると日本語のテキストファイルができあがります


PowerShell2.0 : 全ての日本語ヘルプファイル(テキスト)を作成するスクリプト
次に以下のスクリプトで MKEditor をダウンロードしてインストールできます。 必要なのは、インストール時に作成される「新規」で使える Shell 拡張です。 ( インストールはUAC はオフにして実行して下さい ) ヘルプのあるディレクトリで実行すると、MKEditor のプロジェクトを自動的に 作成します。 【MKEditor】 WEB WSH インストーラ (※ 上級者用) ※ Wiindows7 でのUAC オフ Uac
posted by at 2010-03-28 17:03 | PowerShell | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX