SQLの窓

2018年06月12日


PowerShell( 実質C# )を使用して、ファイルの分割を行う

最初に『OpenFileDialog』でファイルを開くダイアログを表示して、そのファイルを1メガバイト(0x100000) のファイルに分割します。( ここでは、初期フォルダは C:\ )



split_file.ps1

readSize はバッファーに読み取られた合計バイト数で。 要求しただけのバイト数を読み取れなかった場合、この値は要求したバイト数より小さくなります。
$code = @"
using System;
using System.IO;
using System.Windows.Forms;
public class MyClass {
	public static void split_file() {


		OpenFileDialog obj = new OpenFileDialog();
		obj.Filter = "全て|*.*";
		obj.InitialDirectory = @"C:\";

		if (obj.ShowDialog() != DialogResult.OK) {
			return;
		}

		// 分割ファイルの拡張子の連番用
		int count = 0;

		// 入力ファイル
		FileStream fsi = new FileStream( obj.FileName, FileMode.Open, FileAccess.Read);

		// オリジナルファイル名
		string FileName = Path.GetFileName(obj.FileName);

		// 1メガバイト
		byte[] buffer = new byte[0x100000];
		// 読み込まれたサイズ
		int readSize;
		while(true) {
			// 読み込み
			readSize = fsi.Read(buffer, 0, buffer.Length);
			if (readSize == 0) {
				break;
			}
			count++;

			// 出力ファイル
			FileStream fso = new FileStream( string.Format("{0}.{1:000}", FileName, count),FileMode.Create,FileAccess.Write);
			fso.Write(buffer, 0, readSize);
			fso.Close();
		}
		fsi.Close();
	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

[MyClass]::split_file()



inter_active.bat
echo off

echo 処理を開始しました

powershell -NoProfile -ExecutionPolicy Unrestricted .\split_file.ps1
実行すると、拡張子が オリジナルファイル名.001、オリジナルファイル名.002 というように連番で分割して作成されます。 結合は、copy コマンドを使用して行う事ができます
copy /b オリジナルファイル名.001 + オリジナルファイル名.002 オリジナルファイル名
関連する記事 PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法 PowerShell( 実質C# )を使用して、MessageBox の応答でバッチファイルの処理を変化させる
posted by lightbox at 2018-06-12 11:34 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年06月09日


PowerShell( 実質C# )を使用して、MessageBox の応答でバッチファイルの処理を変化させる

PowerShell は、C# のコードをそのまま実行する事ができるので、MesaageBox を表示させて、そまの応答結果をファイルに書き込んで、バッチファイル内の for で読み込み、内容によって実行先を変化させます

console_message_box.ps1
$code = @"
using System;
using System.IO;
using System.Windows.Forms;
public class MyClass {
	public static void console_message_box() {

		string path = Environment.GetEnvironmentVariable("temp");

		string writePath = string.Format(@"{0}\_check_result",path);

		StreamWriter sw = new StreamWriter(writePath,false);

		DialogResult check = MessageBox.Show("実行しますか?","確認", MessageBoxButtons.OKCancel);
		if (check == DialogResult.OK)
		{
			sw.Write("1");
		}
		else
		{
			sw.Write("0");
		}

		sw.Close();

	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

[MyClass]::console_message_box()



inter_active.bat
echo off

echo 処理を開始しました

powershell -NoProfile -ExecutionPolicy Unrestricted .\console_message_box.ps1

FOR /F %%i IN (%temp%\_check_result) DO (
	if "%%i"=="1" goto :ok
	if "%%i"=="0" goto :cancel
)

:ok
echo OK を選択しました
goto :end

:cancel
echo Cancel を選択しました
goto :end


:end


関連する記事

PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法

バッチファイル内で、コマンドプロンプトが管理者権限で実行されているかのチェック






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

2018年05月22日


PowerShell で C# のソースコード(get_rec_mysql.cs) を使用して System.Data.Odbc で MySQL のデータを一覧表示( csv )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
PowerShell で System.Data.Odbc を使用して MySQL のデータを一覧表示( csv ) では、PowerShell の記述で処理しましたが、特異な環境や目的でも無いかぎり、C# のコードを直接使用したほうが、流用しやすくコストが安く済みます。 get_rec_mysql.cs は、一般的な using を使用した単純なデータベースの行の取得です。このコードを PowerShell で実行するには以下の3行で可能です。
Add-Type -path "get_rec_mysql.cs" `
	-ReferencedAssemblies System.Windows.Forms, System.Data
[Program]::Start()
get_rec_mysql.cs
using System;
using System.Data.Odbc;
using System.Windows.Forms;

public class Program
{
	public static void Start()
	{

		loadMySql();

		Console.WriteLine( "処理が終了しました" );

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

	}

	public static void loadMySql() {

		using (OdbcConnection myCon = new OdbcConnection())
		using (OdbcCommand myCommand = new OdbcCommand())
		{
			// 新しい OdbcConnectionStringBuilder オブジェクトを作成
			OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

			// ドライバ文字列をセット ( 波型括弧{} は必要ありません )
			// 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("SERVER", "localhost");
			builder.Add("DATABASE", "lightbox");
			builder.Add("UID", "root");
			builder.Add("PWD", "");

			// 内容を確認
			Console.WriteLine(builder.ConnectionString);

			myCon.ConnectionString = builder.ConnectionString;

			// *********************
			// 接続
			// *********************
			try
			{
				// 接続文字列を使用して接続
				myCon.Open();
				// コマンドオブジェクトに接続をセット
				myCommand.Connection = myCon;
				// コマンドを通常 SQL用に変更
				myCommand.CommandType = System.Data.CommandType.Text;
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
				return;
			}

			// *********************
			// 実行 SQL
			// *********************
			myCommand.CommandText = "select * from 社員マスタ";

			// *********************
			// レコードセット取得
			// *********************
			try 
			{
				using (OdbcDataReader myReader = myCommand.ExecuteReader())
				{
					string csv_format = "{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}";
					string out_line = "";

					while( myReader.Read() ) {

						out_line = string.Format(csv_format,
							myReader.GetValue(0).ToString(),
							myReader.GetValue(1).ToString(),
							myReader.GetValue(2).ToString(),
							myReader.GetValue(3).ToString(),
							myReader.GetValue(4).ToString(),
							myReader.GetValue(5).ToString(),
							myReader.GetValue(6).ToString(),
							myReader.GetValue(7).ToString(),
							myReader.GetValue(8).ToString(),
							myReader.GetValue(9).ToString(),
							myReader.GetValue(10).ToString()
						);

						Console.WriteLine( out_line );

					}
					// リーダを使い終わったので閉じる
					myReader.Close();
				}
			}
			catch (Exception ex)
			{
				myCon.Close();
				MessageBox.Show(ex.Message);
				return;
			}

			// 接続解除
			myCon.Close();
 

		}
	}

}




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

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