業務改善!Windows PowerShell入門

Windows PowerShellで、とにかく楽をしたい!実際に仕事で楽になった事、便利になった事を紹介しつつ進めていきます。

PowerShell コマンドレットにおけるカッコの意義について考察しろ!

コマンドレットのメンバーにアクセスする場合、気をつけねばならぬことがある。

Get-Dateコマンドレットを例にして、それを述べたい。

 


 

Get-Dateコマンドレットは日付時刻を取得するコマンドレットだ。
コンソールにそのまま叩き込むと、結果は以下の通り表示される。

 

f:id:acoustic_groove:20180108120622p:plain


ここで、よくありがちな、yyyy/MM/dd形式の結果が欲しいときはどうしたらいいか?

無論、PowerShell様、.NET Framework様ゆえ、オブジェクトのメソッドにそいつはある。

 

ToStringメソッドだ。引数に書式を設定するだけで簡単に結果をgetできるはずであるが......

 

以下、「PowerShellやるゾウ君」と、「天の声」でいくゼ!

 

PowerShellやるゾウ君

PowerShell様、.NET Framework様、こいつでおねげぇしやす!

ひゃっ、ひゃっ、ひゃっ。

 

Get-Date.ToString("yyyy/MM/dd")

 

f:id:acoustic_groove:20180108235337p:plain

 


ぬわんと!エラーが出たやないけ。

 

どうなっとるんやぁ、PowerShell様、.NET Framework様。

メソッド間違っとらへんかなぁ.....。確認するために、こいつを叩き込んでみよ。

 

Get-Date | gm | Where{$_.Name -eq "ToString"}

 

f:id:acoustic_groove:20180108235424p:plain

 


メソッドあるげ!何であかんかもう分からんわ。
俺、何も悪いことしてへんぞ。このタニシ!

とりあえず、もうやる気ねぇべ。

 

天の声

喝!!!!!!
もうおめえ、めんどくさいから先に答え言うわ。


コマンドレットに、カッコつけるだけじゃ!

 

 

(Get-Date).ToString("yyyy/MM/dd")

 

f:id:acoustic_groove:20180108235438p:plain


カッコをつける理由は、コマンドレットが完了してから、返されたオブジェクトのメソッドにアクセスする必要があるからじゃ!


たった1行でyyyy/MM/dd形式を得ているが、イメージ的には以下のように、2行に渡ってやっていることを簡略化したようなもんである。

 

 

$date = Get-Date 
$date.ToString("yyyy/MM/dd")

 

 

今回はGet-Dateコマンドレットが命題であったが、これが現在のロケーションを取得するGet-Locationコマンドレットであろうが、同じことである。

 

Get-Locationコマンドレットを使って、ロケーションのパス文字列だけを取得したいのであれば、以下のようにする。

 

 

(Get-Location).Path

 

 

カッコのなかでコマンドレットを完了したあと、コマンドレットのプロパティにアクセスしているのである。


分かったか?
分かったら、歯磨いて寝ろ!

 

PowerShell、イエーイ!

 

 

PowerShell ファイルを開くダイアログを召喚しろ!

 

スクリプトを作成していると、往々にして処理対象の入力ファイルを必要とする場合がある。こんな場合、どうするか?

 

1.スクリプトにファイルパスを直接埋め込む。
2.Read-Hostコマンドレットを利用し、コンソールにファイルをドラッグ&ドロップ

 

上記が一番手っ取り早い方法であろう。

しかし、「スクリプト配布」を考えたとき、これらはどうか?

 

  • 1番はファイルパスが常に固定なとき以外は論外である。
  • 2番はまぁ、1番より進化したやり方ではあるが、慎重を期するシーンではマウス誤操作の懸念がある。

 

さらっと、考察するだけでこんな問題がある。
よって、これらを解決するための手法を考えねばならない。

 


.NET Frameworkの御力にあっさりすがれ!

.NET FrameworkWindows.Forms名前空間にあるOpenFileDialogクラスに頼れば、問題解決ができる。 こいつを使えば、「ファイルを開く」ダイアログを表示することができる。

 

では、実践的なサンプルと実行結果といこうゼ!

内容は、以下のようなCSVファイルを「ファイルを開く」ダイアログを使って、ユーザに選んでもらい、簡易GUIに出力して確認してもらうという想定だ。

 

 f:id:acoustic_groove:20171230003251p:plain

第9回男性が選ぶなりたい顔ランキング.csv

 

 

#------------------------------------------------
# 処理名:Fn_OpenFile()
# 概 要:ファイルを開くダイアログを表示する 
# 引 数:なし
# 戻り値:ファイル名フルパス
#------------------------------------------------
Function Fn_OpenFile(){
    
    #アセンブリのロード
    Add-Type -AssemblyName System.Windows.Forms

    #ダイアログインスタンス生成
    $dialog = New-Object Windows.Forms.OpenFileDialog
    
    #タイトル、選択可能ファイル拡張子、初期ディレクトリ
    $dialog.Title = "ファイルを選んでくれ!"
    $dialog.Filter = "CSVファイル(*.csv) | *.csv"
    $dialog.InitialDirectory = "C:\hoge\CSV"
  
    #ダイアログ表示
    $result = $dialog.ShowDialog()

    #「開くボタン」押下ならファイル名フルパスをリターン
    If($result -eq "OK"){
        Return $dialog.FileName 
    }Else{
        Break
    }

}

#ファイル取得
$file = Fn_OpenFile

#CSVファイルを読み込んでグリッド出力する
Import-CSV $file | Out-GridView -Title "第9回男性が選ぶなりたい顔ランキング"

Read-Host "×ボタンで終了"

 

 

f:id:acoustic_groove:20171230004229p:plain

ファイルを開くダイアログ

 

f:id:acoustic_groove:20171230004239p:plain

Out-GridView


「ファイルを開くダイアログ」はとても汎用性が高い!
よって、関数化している。俺は普段、仕事で使う自分の端末ではプロファイルに登録している。
プロファイルに登録しておけば、いつでも呼び出せるからな。

 

▼プロファイルについての記事はこちら

PowerShell プロファイルを利用しろ!#1 - 業務改善!Windows PowerShell入門

PowerShell プロファイルを利用しろ!#2 - 業務改善!Windows PowerShell入門

  

 

OpenFileDialogクラスの主要メンバ

 

<プロパティ>
Title
ダイアログのタイトル。

 

Filter
ダイアログで選択可能な拡張子。
"hogeファイル(*.hoge) | *.hoge" 形式で設定する。
パイプの左側:ファイルの種類に表示する文字列
パイプの右側:拡張子

 

InitialDirectory
初期表示ディレクトリ。
自分の端末で作業する場合は、$home + "\Desktop" で、デスクトップを初期表示ディレクトリにしておくと何かと便利だゼ!
デスクトップには色んなショートカットが置いてあるはずだからな。
($homeは環境変数であり、ホームパスを取得できる。)

 

FileName
ファイル名フルパス。

 

<メソッド>
ShowDialog()
ダイアログ表示をする。戻り値あり。
開く:OK
キャンセル:Cancel

 

 

ついでに、今回登場したコマンドレットを紹介したい。

  • Import-CSVエイリアス:ipcsv)
    CSVファイルを読み込んで、PSCustomObjectに変換する。
    メチャクチャよく利用するので、今後これについての記事を書きたいと思う。
  • Out-GridView(エイリアス:ogv)
    オブジェクトをグリッドビュー出力する。
    メチャクチャよく利用する。GUIで色々見れるのは便利だ。
    Titleパラメータでタイトル文字を設定することができる。
 

 

気をつけやがれ!

「ファイルを開く」ダイアログを実装して、PowerShell 2.0でやるとうまくいかない場合がある。 ダイアログがいつまでたっても表示されない。 スクリプトをISEから実行する場合は問題ない。 問題があるのは以下のケースだ。

 

・コンソールから実行する場合
スクリプトファイルを「右クリック→PowerShellで実行」の場合

 

なぜ、動かないのかは、STA(シングルスレッドアパートメント)、MTA(マルチスレッドアパートメント)の違いから発生する。

 

 

PowerShellがMTAなのに対しWindows.Forms名前空間に属しているOpenFileDialogクラスは、STAを使用するためである。

 

さて、STAとMTAが何たるかであるが、どえらい簡単に説明する。

 

そもそも、スレッドとはプログラムの処理の実行単位である。 それが、シングル(1本線)、マルチ(枝分かれした線)かということである。

フローチャートでいうところの開始から終了まで、1本線でいくのか、枝分かれした線でいくのかという話だゼ!

 

仕事で使っている端末はWindows7 SP1で、MTAモードのため、普通ならISEからしか使えない。 しかし、PowerShell.exeの起動オプションには、STAというオプションがある。

 

よって、コンソールで以下のように実行すれば、解決することができる。

 

PowerShell -STA ./hoge.ps1 

 

 

また、スクリプト配布を視野に入れる場合は、以下のような解決方法もある。

 

PowerShellスクリプトを起動するための、起動用スクリプトをVBSやバッチファイルから作る。
・この起動用スクリプトの中にSTAオプションを仕込んでおく。

 

これについては、以下の記事にて詳しく書いてある。 

PowerShell スクリプトファイルを配布しろ!#3 - 業務改善!Windows PowerShell入門

 

 

さて、2017年ももうすぐ終わりだな......。

PowerShell、イエーイ!

 

ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。

▼ロリポップ!レンタルサーバーはこちら

PowerShell Oracleデータベースを操作しろ!#3

Oracleデータベース操作についての記事、第3弾である。

 

▼第1弾、第2弾の記事はこちら。

PowerShell Oracleデータベースを操作しろ!#1 - 業務改善!Windows PowerShell入門

PowerShell Oracleデータベースを操作しろ!#2 - 業務改善!Windows PowerShell入門

 

第1弾では、「接続、データをぶっこ抜く」ということだけをやった。
第2弾では、「例外(エラー)処理の実装」を追加した。

 

そして、今回はぶっこ抜いたデータに対して、以下を行いたいと思う。

 

・コマンドレットによる二次加工
XMLファイル出力


まずは、参考までに第2弾後のソースである。

 

#アセンブリのロード
Add-Type -AssemblyName System.Data.OracleClient

#////接続文字列の作成////
#Data Source:接続先
#User ID    :ユーザーID
#Password   :パスワード
#Integrated Security:Windowsアカウントの資格情報を認証に使うかどうか
$ConnectionString = "Data Source=orcl;User ID=system;Password=0000;Integrated Security=false;"

#OracleConnectionオブジェクトの作成
$OraCon = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)

#Oracle接続確認
Try{
    $OraCon.Open()
    $OraCon.Close()
}Catch{
    Write-Host "DB接続エラー!" -ForegroundColor Red
    Write-Host $Error[0].Exception.Message
    Break
}

#データセットの作成
$dtSet = New-Object System.Data.DataSet

#データテーブルの作成
$dtSet.Tables.Add("部門")
$dtSet.Tables.Add("従業員")

#SQL文の作成
$strSQL = @()
$strSQL += "SELECT * FROM SCOTT.DEPT"
$strSQL += @"
SELECT
    EMPNO,
    ENAME,
    DEPTNO,
    JOB
FROM
    SCOTT.EMP
WHERE
    DEPTNO IN(10,30)
ORDER BY 
    DEPTNO ASC
"@

#データセットの全テーブルへの処理
$i = 0
ForEach($tb in $dtSet.Tables){
    
    #テーブル名を表示
    Write-Host "▼ $i 番目のテーブル" -ForegroundColor Yellow
    Write-Host $tb.TableName
    
    #OracleDataAdapterクラスのオブジェクト作成
    $data = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL[$i], $OraCon) 
    
    Try{
        #アダプタを通じて、Oracle接続し、SQL実行結果をデータセットのテーブルに格納
        [void]$data.Fill($tb)
        
    }Catch{
        Write-Host "DB接続、またはSQLエラー!" -ForegroundColor Red
        Write-Host $Error[0].Exception.Message
        $i++
        Continue
    }
    
    #テーブルのデータを表示
    $tb | Format-Table -AutoSize    
    $i++
}

 


コマンドレットによる二次加工

今回のデータベース操作では、「非接続型のデータベース接続」で、データをぶっこ抜いている。そして、OracleDataAdapterクラスを使用して、データセットにデータを格納している。

 

よって、このデータはOracle切断後も、何度でも自由にこねくり回すことができるのである。

 

やったゼ!ここで、PowerShellの至宝、パイプライン処理を召喚したい。

  

嗚呼、偉大なるパイプライン処理よ!

 

データセットに格納した部門テーブルをこねくり回してくれ。

 

$dtSet.Tables[0].Rows | Where{$_.DEPTNO -gt 10} | Select DEPTNO | Sort DEPTNO -desc

 

・DEPTNOが10よりデカいやつ
・出力列はDEPTNOだけを選択
・DEPTNOの降順

 

 

f:id:acoustic_groove:20171227215837p:plain

 

▼パイプライン処理についての基礎はこちら。

PowerShell パイプラインを速習しろ! - 業務改善!Windows PowerShell入門

 

XMLファイル出力

コンソールに表示するだけでは、物足りないゼ!
大量のデータだった場合はファイルに出力して色々検証したいからな。


PowerShellは、XMLの扱いがとても得意だ。
データセットのデータテーブルはXMLファイルとして、出力し保存することが可能である。データセットのメンバにはそのためのメソッドがある。

 

▼以下をコンソールで入力してみる。

 

$dtSet = New-Object System.Data.DataSet
$dtSet | gm -type Method

 

f:id:acoustic_groove:20171227220903p:plain

 

▼さらに、以下も入力する。 

 

$dtSet.WriteXML

 f:id:acoustic_groove:20171227221121p:plain

 

gmは、Get-Memberコマンドレットのエイリアス
typeは、MemberTypeパラメータのエイリアス
 主に指定するのは、MethodかPropertyが多い

 

以上より、WriteXmlメソッドのパラメータにファイル名フルパスを指定すれば良い。

 

楽でええのー!!

 

出力保存した後は、Invoke-Itemコマンドレット(エイリアスii)で、ファイルを開いて確認する。

 

#部門テーブルをXML出力
$fileName = "C:\hoge\DB接続\XML\" + $dtSet.Tables[0].TableName + ".xml"
$dtSet.Tables[0].WriteXml($fileName)
#XMLを開く Invoke-Item $fileName

 

f:id:acoustic_groove:20171227222056p:plain

 

 

▼エクセルを使って見てみると、こんな感じだ。

f:id:acoustic_groove:20171227222151p:plain

 

Invoke-Itemコマンドレット
・非常に使い勝手が良いゼ!俺は頻繁に使っているコマンドレットだ。
・パラメータにフォルダパスやファイルパスを指定すると、そいつらを開いて(実行して)くれる。
・ファイルの場合は関連付けプログラムによって、適切に開いて(実行して)くれる。

 

 

XMLについての関連記事はこちら

PowerShell XMLファイルにアクセスしろ! - 業務改善!Windows PowerShell入門

 


 

 

以上をもって、今回でOracleデータベース操作の記事は一旦終了する。

最後に、今回のテーマを加味した、ソースを以下に示すゼ!

Thank You,Yeah!

 

#アセンブリのロード
Add-Type -AssemblyName System.Data.OracleClient

#////接続文字列の作成////
#Data Source:接続先
#User ID    :ユーザーID
#Password   :パスワード
#Integrated Security:Windowsアカウントの資格情報を認証に使うかどうか
$ConnectionString = "Data Source=orcl;User ID=system;Password=0000;Integrated Security=false;"

#OracleConnectionオブジェクトの作成
$OraCon = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)

#Oracle接続確認
Try{
    $OraCon.Open()
    $OraCon.Close()
}Catch{
    Write-Host "DB接続エラー!" -ForegroundColor Red
    Write-Host $Error[0].Exception.Message
    Break
}

#データセットの作成
$dtSet = New-Object System.Data.DataSet

#データテーブルの作成
$dtSet.Tables.Add("部門")
$dtSet.Tables.Add("従業員")

#SQL文の作成
$strSQL = @()
$strSQL += "SELECT * FROM SCOTT.DEPT"
$strSQL += @"
SELECT
    EMPNO,
    ENAME,
    DEPTNO,
    JOB
FROM
    SCOTT.EMP
WHERE
    DEPTNO IN(10,30)
ORDER BY 
    DEPTNO ASC
"@

#データセットの全テーブルへの処理
$i = 0
ForEach($tb in $dtSet.Tables){
    
    #テーブル名を表示
    Write-Host "▼ $i 番目のテーブル" -ForegroundColor Yellow
    Write-Host $tb.TableName
    
    #OracleDataAdapterクラスのオブジェクト作成
    $data = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL[$i], $OraCon) 
    
    Try{
        #アダプタを通じて、Oracle接続し、SQL実行結果をデータセットのテーブルに格納
        [void]$data.Fill($tb)
        
    }Catch{
        Write-Host "DB接続、またはSQLエラー!" -ForegroundColor Red
        Write-Host $Error[0].Exception.Message
        $i++
        Continue
    }
    
    #テーブルのデータを表示
    $tb | Format-Table -AutoSize    
    $i++
}


#コマンドレットによる二次加工
Write-Host "▼部門テーブルをコマンドレットで二次加工" -ForegroundColor Yellow
$dtSet.Tables[0].Rows | Where{$_.DEPTNO -gt 10} | Select DEPTNO | Sort DEPTNO -desc

#部門テーブルをXML出力
$fileName = "C:\hoge\DB接続\XML\" + $dtSet.Tables[0].TableName + ".xml"
$dtSet.Tables[0].WriteXml($fileName)

#XMLを開く
Invoke-Item $fileName

 

 

PowerShell、イエーイ!

 

ロリポップ!なら初心者でも安心!
大人気のWordpress簡単インストールやショッピングカートなど
誰でもカンタンに使える機能が満載!

PowerShell メッセージボックスを使い倒せ!

以前、PowerShellにおけるメッセージボックスについての記事を書いたところ好評であった。

よって、メッセージボックス関連の第2弾をお送りしたい。

 

▼前回のメッセージボックス関連の記事  

PowerShell メッセージボックスを表示しろ! - 業務改善!Windows PowerShell入門

 



さて、PowerShellでメッセージボックスをやろうと思っても、残念ながら、組み込みメソッドがない。(※特に準備せずともいきなり使えるもの)

だが、COMオブジェクトを利用をすれば、メッセージボックスが実装可能となる。

 

・どうやって実装するんや?!

以下の手順で、あっという間にできるゼ!

 

New-Objectコマンドレットを使用し、COMオブジェクトのインスタンスを作成する。
・ComObject(com)パラメータのProgIDとして、Wscript.Shellを指定する。
・Wscript.ShellのインスタンスPopupメソッド使用して、あとは使い倒す!

 

※COMとはMicrosoftが提供する部品化されたプログラムのことであり、アプリケーションに組み込むことができる。

 

$ws = New-Object -com Wscript.Shell
$ws.Popup("俺は高木ブーだ!")

 

f:id:acoustic_groove:20171220223414p:plain

 

だが、これは見た目があまりよろしくない。

タイトルが「Windows Script Host」とそのまんま出すのは、いけ好かないだゼ!

 

よって、Popupメソッドの引数と戻り値について、詳しく解説したい。

$ws.Popupと打ちこむと、以下のように「引数は4つ、戻り値がある」ということが分かる。

 

f:id:acoustic_groove:20171220223853p:plain

 

ではこれがどうなっているかだが、以下にすべてまとめた。 

 

・引数はどうなっとるんや?! 

 

  内 容
引数1 メッセージ
引数2 自動クローズ秒数
引数3 タイトル
引数4 表示するボタン

 

引数1はメッセージ内容だ。
・引数2は自動クローズ秒だ。0を指定すれば、ボタンを押すまで表示され続ける
1を指定すれば、1秒後に閉じる。
・引数3はタイトルだ。
・引数4は表示するボタンで、0~5のどれかを指定する。

 

 

・表示するボタン(引数4)の設定値はどうなっとるんや?! 

  設定値
OK 0
OK、キャンセル 1
中止、再試行、無視 2
はい、いいえ、キャンセル 3
はい、いいえ 4
再試行、キャンセル 5

 

 f:id:acoustic_groove:20171220232208p:plain

 

・戻り値はどうなっとるんや?! 

 

  戻り値
O K 1
キャンセル 2
中 止 3
再試行 4
無 視 5
は い 6
いいえ 7

 

※ただし、自動クローズをさせた場合は、-1が戻り値となる。

 


 

▼以下は検証用のソースである。

 

#COMオブジェクト Wscript.Shell
$ws = New-Object -com Wscript.Shell

#============================
# Popupメソッド
#----------------------------
# 引数1:メッセージ
# 引数2:自動クローズ秒数
# 引数3:タイトル
# 引数4:表示するボタン
#============================
# 戻り値
#----------------------------
# O K  :1
# キャンセル:2
# 中 止  :3
# 再試行  :4
# 無 視  :5
# は い  :6
# いいえ  :7
#============================


#表示ボタンと設定値(引数4)
#OK:0
$ws.Popup("元祖高木ブー伝説",0,"曲名",0)

#OK、キャンセル:1
$ws.Popup("元祖高木ブー伝説",0,"曲名",1)

#中止、再試行、無視:2
$ws.Popup("元祖高木ブー伝説",0,"曲名",2)

#はい、いいえ、キャンセル:3
$ws.Popup("元祖高木ブー伝説",0,"曲名",3)

#はい、いいえ:4
$ws.Popup("元祖高木ブー伝説",0,"曲名",4)

#再試行、キャンセル:5
$ws.Popup("元祖高木ブー伝説",0,"曲名",5)

 

だがしかし、インフォメーションやクエスチョンマークなどのアイコン設定ができないのは......

 

 

何だか寂しいゼ!

 


PowerShell、オーマイガっ!

ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。

▼ロリポップ!レンタルサーバーはこちら

PowerShell カラフルにコンソール出力しろ!

今日はPowerShellにおける小技を紹介したいと思う。

 

例えば、Write-Host コマンドレットのテキスト色パラメータの設定値が分からんなあ、という場合の話。インテリセンスやタブ補完に頼らずとも、設定値を知る方法。

 

わざと適当なやつを叩き込め!ぽいぽいぽいぽ、ぽいぽ、ぴー!

 

f:id:acoustic_groove:20171218234947p:plain

 

 

何と!エラー内容から、設定値が全部わかりやがったゼ!

このように、わざと適当なやつを叩き込むことは、けっこう有用な手段となるのである。

 

さて、上記の話から繋げて、今回のテーマである「カラフルにコンソール出力しろ!」であるが、テキスト色の設定値は全部分かっても、実際にどんな色をしているかは、発色を見てみないことには分からない

 

そこで、以下のような色見本確認用スクリプトを作ってみた。

 

#色配列
$colors = @(
"Black",
"DarkBlue",
"DarkGreen",
"DarkCyan",
"DarkRed",
"DarkMagenta",
"DarkYellow",
"Gray",
"DarkGray",
"Blue",
"Cyan",
"Red",
"Magenta",
"Yellow",
"White"
)

#背景色
ForEach($color in $colors){
    Write-Host $color -BackgroundColor $color
}

Write-Host "---------------"

#テキスト色
ForEach($color in $colors){
    Write-Host $color -ForegroundColor $color
}

 

ForegroundColorパラメータ>
「テキスト色」を変えることが出来る

 

BackgroundColorパラメータ>
「背景色」を変えることが出来る

 

<設定値>
両方とも共通で以下の通り
・Black
・DarkBlue
・DarkGreen
・DarkCyan
・DarkRed
・DarkMagenta
・DarkYellow
・Gray
・DarkGray
・Blue
・Cyan
・Red
・Magenta
・Yellow
・White

 

f:id:acoustic_groove:20171218235513p:plain

 

こんなカラフルに出力できるPowerShellは偉い!

 

ところで昔、真っ黒なコマンドプロンプトからマッハでPowerShellを立ち上げて、テキストに色を付けて表示するということを、人前でやって見せた。

 

結果、「どうやって色つけとるんや?!」と興味深く見てくれた。

コマンドプロンプトで色付きなんて見たことがないゼ!何でや。というところであろう。

 

無論、俺は「PowerShellでやったんやわ。PowerShellやと、色つけれるんやでー!」とPowerShellの魅力を語ったのは言うまでもない。

 

PowerShell、イエーイ!

 

ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。

▼ロリポップ!レンタルサーバーはこちら

PowerShell Oracleデータベースを操作しろ!#2

Oracleデータベース操作についての記事、第2弾である。

 

▼前回の記事はこちら。

PowerShell Oracleデータベースを操作しろ!#1 - 業務改善!Windows PowerShell入門

 

今回はOracleデータベース操作における例外処理について触れたい。

第1弾ではとりあえず、「接続、データをぶっこ抜く」ということが主なテーマであった。そのため、最後にまとめたソースも例外(エラー)処理を全くかましていない状態である。

 

よって、今回は第1弾のソースに例外処理をかましていきたい。

 


例外処理とはどんなんや?

例外処理とは、プログラムが異常な動作をする場合にやる処理のことである。

そのため事前にエラーが起きそうな処理を想定して、何らかの処理を仕込んでおくことをすれば良いわけである。

 

今回の例外処理では、Try~Catch~Finallyステートメントを用いた構造化エラー処理を使用する。

 

構文と流れはこうだゼ!

 

Try{
エラーが起きそうな処理
}Catch[エラーの型]{
エラー時にやってあげる処理
}Finally{
エラー有無によらず必ずやる処理
}

 

1.Tryブロックでエラー発生!

2.即座にTryブロックを抜けろ!

3.Catchブロックの処理に行け!

4.Finallyブロックの処理をやって終わり。

※エラーの型、Finallyブロックは省略可能。

 

どこに例外処理をかますんや?!

最低限のことだけを想定すると、例外処理かまさねばならんのは、以下の2点である。

・データベース接続

SQL実行

 

これを踏まえ、第1弾のソースを以下のように改修した。

 

#アセンブリのロード
Add-Type -AssemblyName System.Data.OracleClient

#////接続文字列の作成////
#Data Source:接続先
#User ID    :ユーザーID
#Password   :パスワード
#Integrated Security:Windowsアカウントの資格情報を認証に使うかどうか
$ConnectionString = "Data Source=orcl;User ID=system;Password=0000;Integrated Security=false;"

#OracleConnectionオブジェクトの作成
$OraCon = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)

#Oracle接続確認
Try{
    $OraCon.Open()
    $OraCon.Close()
}Catch{
    Write-Host "DB接続エラー!" -ForegroundColor Red
    $Error[0].Exception.Message
    Break
}

#データセットの作成
$dtSet = New-Object System.Data.DataSet

#データテーブルの作成
$dtSet.Tables.Add("部門")
$dtSet.Tables.Add("従業員")

#SQL文の作成
$strSQL = @()
$strSQL += "SELECT * FROM SCOTT.DEPT"
$strSQL += @"
SELECT EMPNO,ENAME,DEPTNO,JOB FROM
    SCOTT.EMP
WHERE
    DEPTNO IN(10,30)
ORDER BY 
    DEPTNO ASC
"@

#データセットの全テーブルへの処理
$i = 0
ForEach($tb in $dtSet.Tables){
    
    #テーブル名を表示
    Write-Host "▼ $i 番目のテーブル" -ForegroundColor Yellow
    Write-Host $tb.TableName
    
    #OracleDataAdapterクラスを使用して、データの取得
    $data = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL[$i], $OraCon) 
    
    Try{
        #データセットのテーブルに取得データを格納
        [void]$data.Fill($tb)
        
    }Catch{
        Write-Host "DB接続、またはSQLエラー!" -ForegroundColor Red
        $Error[0].Exception.Message
        $i++
        Continue
    }
    
    #テーブルのデータを表示
    $tb | Format-Table    
    $i++
}

 

Oracle接続確認」のときにかます

ソースの前半部分で、Oracle接続確認をしている。

ここにまずは例外処理をかましている。

 

#Oracle接続確認
Try{
    $OraCon.Open()
    $OraCon.Close()
}Catch{
    Write-Host "DB接続エラー!" -ForegroundColor Red
    $Error[0].Exception.Message
    Break
}

流れとしては、Tryブロックで接続成功したら、そのまま一旦接続を解除している。


もし、接続に失敗したら、Catchブロックに飛んでエラーの通知をした後、Breakキーワードを使って、以降の処理を実施しないようにしている。
(※成功時に何故、一旦接続解除をしているかはこの後すぐ説明する。)


さて、今回のOracelデータベース操作で大活躍しているOracleClient名前空間のOracleDataAdapterクラスだが、これは非接続型のデータベース接続方法である。

 

イメージは下図の通りだ。 

 

f:id:acoustic_groove:20171217003458p:plain

 

<非接続型とは>
「データベース接続、データ抽出、データセット保持、データベース接続解除」をまとめてやってくれる。

さて、このタイミングであるが、ソースの後半にあるFillメソッド実行時である。
明示的にOpen、Closeをしなくても良いのである。

楽だ。非常にありがたい!
だが、まとめて処理する前に接続確認だけはしておきたいゼ!
これが、前半に例外処理をかました理由である。

 

<接続型とは>
データベースの接続を確立した後、明示的に切断するまで、接続を維持し続ける。
面倒くさいが自分でOpen、Closeをやらないといけない。

 

 

以下は、まちがった接続文字列でOracleデータベースに接続を試みた場合の例外処理である。

 

f:id:acoustic_groove:20171217004525p:plain

 

「データセットの全テーブルへの処理」のときにかます

ここで例外処理をかます目的は、SQL文が間違っていた場合のフォローが主目的である。 前半で接続確認は一旦とれているので。

 

しかし、此処に来て接続できないことも想定されるので、プロンプトに「DB接続、またはSQLエラー!」と表示をするようにした。

どっちのエラーかはメッセージを見れば一目瞭然だからだ。

 

以下は、Oracleデータベースに存在しないテーブルにSELECT実行しようとした場合の実行結果である。

 

0番目のテーブルで失敗したら、しっかり例外捕捉したあと、Continueキーワードを使って、Try~Catchブロック以降にあるテーブルデータ表示をしない。そして、1番目のテーブル取得をするため次のループ処理をしたのが分かる。

 

f:id:acoustic_groove:20171217004744p:plain

 

$Error[0]について

Catchブロックに仕込んである$Error[0]だが、これが何かを説明しておく。
こいつは自動変数であり、発生したエラー内容が格納されているゼ!
配列になっていて、直近のエラーは要素番号0で取得可能だ。
常に要素番号0に最新のエラーがいらっしゃいます!

 

自動変数$ErrorExceptionにいるMessageというメンバでエラーメッセージが取得できる。

自動変数についてはこれまでの記事で何度も登場しているが、便利このうえない野郎である。

 


次回、第3弾は取得したデータセットのテーブルをファイルに出力する方法や、PowerShellのコマンドレットとの連携によるテーブルの二次加工について触れる予定である。


PowerShell、イエーイ!

ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。

▼ロリポップ!レンタルサーバーはこちら

PowerShell 誰得?!エディタ風にコンソール出力しろ!

やぁ、こんばんは。

俺は今日もPowerShellライフを楽しんでいる。

 

しかし、たまには誰得?!な

 

何の役にも立たないスクリプトを作って遊ぶのも一興だゼ!

 

 

遊びの内容はこうだ。

 

PowerShellスクリプトファイルの内容をコンソール出力する。

で、以下の2点で遊ぶ。 

・各行に行番号を出力する。

・コメント行は緑色で出力する。

(※ただし、マルチラインコメントは考慮しないので、対象外)

 

以上。

では、遊ぶ!

低スペックなエディタ風に出力する遊び

 

#--------------------------------------
# 低スペックなエディタ風に出力する遊び
#--------------------------------------
$file = Read-Host "ファイル指定"
Write-Host ""

[int]$i = 0
ForEach($line in gc $file){
    
    #行番号インクリメント
    $i++

    #判定用文字列、出力用文字列の作成
    $chkStr = $line.Trim()
    $outLine = ([string]$i).PadLeft(4,"0") + ":" + $line
        
    #空白行
    If($chkStr.Length -eq 0){   
        Write-Host $outLine
        Continue
    }
    
    #先頭1文字:"#"
    If($chkStr.SubString(0,1) -eq "#"){
        Write-Host $outLine -ForegroundColor Green
        Continue
    }  

    #上記以外
    Write-Host $outLine
    
}

Write-Host ""
Read-Host "×ボタンで終了!"

f:id:acoustic_groove:20171215235847p:plain

 

このスクリプト自身を出力してみた。 このスクリプトの核となるのは、Get-Contentコマンドレットエイリアスgc)だ。

 

このコマンドレットで取得したテキストの全行に、ForEachステートメントをブチかまして各行の判定をしていく。 ForEachステートメントの中でやることは以下の通りだ。

 

1.判定専用の文字列を作成する。ただし、各行のインデントが判定の邪魔になるので、空白除去(StringクラスのTrimメソッド使用)をかます。
2.遊びの内容である行番号付きの文字列を作成する。見た目を良くするために、行番号の前ゼロ補完StringクラスのPadLeftメソッド使用)をする。行番号用変数の$iの型変換も重要だ。
3.空白行なら、色はノーマル出力。
4.先頭1文字目が#なら、色は緑色出力!
5.上記以外なら、色はノーマル出力!

 

注意すべきは、処理中に該当行がヒットしたら、Continueを使って、次のループに飛ぶことだ。

 

遊び終了!

ふっ、まったくマジで誰得だったゼ。

 

PowerShell、イエーイ!

 

ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。

▼ロリポップ!レンタルサーバーはこちら