SQLの窓

2020年01月16日


PowerShell のバージョンを確認して、最新の PowerShell(pwsh)を実行する方法

インストールした PowerShell のバージョンを確認するには、PowerShell コンソール (または ISE) を起動し、「$PSVersionTable」と入力して Enter キーを押します。 PSVersion の値を探します。

PS C:\Users\lightbox> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.18362.145
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.145
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
PowerShell 6 以降を使う場合は、Windows PowerShell ではなく PowerShell Core をインストールする必要があります。 ※ dotnet tool install --global PowerShell を実行するのですが、既にインストールされている dotnet tool のバージョンによってはインストールに失敗する場合があり、その場合は後述の .NET Core SDK の最新版をインストールしてから dotnet tool install --global PowerShell を実行します。
PS C:\Users\lightbox> dotnet tool install --global PowerShell                                                           
.NET Core へようこそ!
---------------------
.NET Core についての詳細情報: https://aka.ms/dotnet-docs
'dotnet --help' を使用して利用可能なコマンドを確認するか、次にアクセスしてください: https://aka.ms/dotnet-cli-docs

テレメトリ
---------
.NET Core ツールは、エクスペリエンスの向上に役立つ利用状況データを収集します。データは匿名で、コマンドライン引数が含まれません。データは Microsoft によって収集され、コミュニティと共有されます。テレメトリをオプトアウトするには、お好きなシェ ルを使用して、DOTNET_CLI_TELEMETRY_OPTOUT 環境変数を '1' または 'true' に設定します。

.NET Core CLI ツールのテレメトリに関する詳細情報をお読みください: https://aka.ms/dotnet-cli-telemetry

ASP.NET Core
------------
ASP.NET Core HTTPS 開発証明書が正常にインストールされました。
証明書を信頼するには、'dotnet dev-certs https --trust' (Windows および macOS のみ) を実行します。その他のプラットフォー ムで信頼を確立するには、プラットフォーム固有のドキュメントをご覧ください。
HTTPS を構成する方法の詳細については、https://go.microsoft.com/fwlink/?linkid=848054 をご覧ください。
.NET Core SDK をインストールしたばかりなので、インストールしたツールを実行する前に、コマンド プロンプト ウィンドウを再び開く必要があります。
次のコマンドを使用してツールを呼び出せます。pwsh
ツール 'powershell' (バージョン '6.2.3') が正常にインストールされました。
pwsh を実行しても動作しない場合は、.NET Core SDK の最新版をダウンロードしてインストールします
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\Users\lightbox> pwsh
PowerShell 6.2.3
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/pscore6-docs
Type 'help' to get help.

PS C:\Users\lightbox> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.2.3
PSEdition                      Core
GitCommitId                    6.2.3
OS                             Microsoft Windows 10.0.18362
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
このページの PDF
posted by lightbox at 2020-01-16 12:13 | 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 | このブログの読者になる | 更新情報をチェックする

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 でエクスプローラでコピーしたファイルリストを取得して、テキストのクリップボードに再度コピーしなおす

参考

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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり