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 "×ボタンで終了!"
このスクリプト自身を出力してみた。 このスクリプトの核となるのは、Get-Contentコマンドレット(エイリアス:gc)だ。
このコマンドレットで取得したテキストの全行に、ForEachステートメントをブチかまして各行の判定をしていく。 ForEachステートメントの中でやることは以下の通りだ。
2.遊びの内容である行番号付きの文字列を作成する。見た目を良くするために、行番号の前ゼロ補完(StringクラスのPadLeftメソッド使用)をする。行番号用変数の$iの型変換も重要だ。
3.空白行なら、色はノーマル出力。
4.先頭1文字目が#なら、色は緑色出力!
5.上記以外なら、色はノーマル出力!
注意すべきは、処理中に該当行がヒットしたら、Continueを使って、次のループに飛ぶことだ。
遊び終了!
ふっ、まったくマジで誰得だったゼ。
PowerShell、イエーイ!
ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。
▼ロリポップ!レンタルサーバーはこちら
PowerShell Oracleデータベースを操作しろ!#1
Windows PowerShellポケットリファレンス改訂新版 3.0/2.0/1.0対応 (Pocket reference) [ 牟田口大介 ]
|
今回より、全数回にわたってPowerShellによるデータベースの操作についてやってくゼ! 扱うデータベースはOracleだ。
Oracle=神託
良い名である。俺がPowerShellにハマったのも神のお告げだったのか?!
・PowerShellでOracleを操作したいゼ!
これまでコマンドラインでのOracleデータベース操作と言えば、Oracle付属ツールであるSQL*Plusをバッチファイルで起動してこねくりまわしていた。だが、、、
もうええ加減バッチファイルは辞めたいゼ!
PowerShellは.NET Frameworkの膨大なクラスが使える。当然、Oracleデータベースへのアクセス、操作も余裕でできるはずである。
・どういう手順と方法でやればええんや?!
.NET Frameworkのクラスを使うにしても、色々と準備等は必要である。
よって、以下の手順と方法でやっていくことをまずは提示しておこう。
1.アセンブリのロード
PowerShellでOracleデータベース操作をするために、一番初めにやらないといけないこと。
それは、アセンブリのロードだ。これをやらずして、Oracleデータベースにアクセスすることも操作することもできねぇゼ!
アセンブリをロードすることによって、PowerShellセッションで .NET FrameWorkクラスの定義が可能となる。
今回ロードするアセンブリは、.NET FrameWorkのOracleClient名前空間にあるクラスだ。
Add-Typeコマンドレットを使って、以下のように書くだけで、はい終了!
楽に書けて良いもんだ。
#アセンブリのロード
Add-Type -AssemblyName System.Data.OracleClient
・.NET FrameWorkのすばらしき恩恵を受けていくことができる。
2.接続用オブジェクトの作成
Oracleデータベース接続には接続文字列を使用する。この接続文字列を使用して、接続用オブジェクトを作成する。
接続文字列とはデータベースに関する情報、データベースへの接続に必要な情報が含まれる文字列のことを言う。
もう、そのまんまだゼ! この接続文字列を使用して、接続用オブジェクトであるOracleConnectionオブジェクトを作成する。
必要となる情報や、書き方については以下の通りだ。
※接続文字列については、拙者のOracle検証用の文字列を記載した。
#////接続文字列の作成////
#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)
3.データセット、データテーブルの作成
さて、いよいよOracleデータベースからデータの取得に着手できそうだ。
ここで気になるのが、OracleClientのどのクラスを使って、データを取得するかとういうことだが、OracleDataAdapterクラスを使用する。
(※OracleDataAdapterクラスの使い方は、以降のセクションで説明)
なぜ、OracleDataAdapterクラスを選んだか。 それは、以下の点に尽きる。
・データセットにデータを格納することができる。
・データセットはクライアントのメモリに展開されるため、Oracleデータベースから切断しても自由に使用ができる。
・自由に使用できるということは、PowerShellで色々こねくりまわす楽しみがある!
さあ、このデータセットとはどんな構成をしているのか。
図で示すと以下の通りだ。
最上位にDataSetが鎮座し、その手下にDataTableがいる。
DataTableはさらに、レコード(行)であるDataRowをたくさん従え、フィールド(列)であるDataColumnで編成されている。
では、大ボスであるデータセットと、その手下のデータテーブルを実際に作成してみたい。
ポイントとなるのは、データセットを作成したあと、配下のデータテーブルを追加することである。
必ず使用したいテーブルの数だけ追加することが重要だ。
また、テーブルの名前はもちろん任意に決められる。
#データセットの作成
$dtSet = New-Object System.Data.DataSet
#データテーブルの作成
$dtSet.Tables.Add("部門")
$dtSet.Tables.Add("従業員")
4.SQL文の作成
OracleデータベースのサンプルであるSCOTTさんの部門テーブル、従業員テーブルに対して、それぞれSELECT実行するSQL文でテストしてみたいと思う。
書き方は以下の通りだ。
#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
"@
・SQL文用の空の配列を一旦作成して、要素追加していく手法にした。
特筆すべきは、PowerShellのヒア文字列(ヒアドキュメント)の恩恵であろう。
・ヒア文字列とは、「@"文字列"@」の形式で記述する文字列のことであり、長文文字列を記すのにとても便利である。
注意点であるが、@"の後、必ず改行して文字列を書くこと。書き終わったら再び、改行して"@でフィニッシュ!
・今回のような基本的なSQL文では、別に使う必要もないが、複雑なSQL文を書く場合、大変に威力を発揮する。
SQL文を作って、そのままペタっと貼れるのだからな。
5.データの取得~データの参照
さて、やっとOracleDataAdapterクラスの出番です。
此処まで、○○とは何かをたくさん説明してきたが、あとはロジックだけ。
ForEachステートメントを使って、データセットの配下にいる全テーブルに処理をぶっかまして、サクッとキメやがるゼ!
データテーブルは全部で2個あるわけだが、要素番号は0から始まるゼ!
ソースは以下の通りだ。
#データセットの全テーブルへの処理
$i = 0
ForEach($tb in $dtSet.Tables){
#OracleDataAdapterクラスを使用して、データの取得
$data = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL[$i], $OraCon)
#Fillメソッドで、データセットのテーブルに取得データを展開
[void]$data.Fill($tb)
#テーブルのデータを表示
Write-Host ▼ $i 番目のテーブル -ForegroundColor Yellow
Write-Host $tb.TableName
$tb | Format-Table
$i++
}
<OracleDataAdapterクラス>
データセットとOracleデータベース間でデータを取得するブリッジ。
第1引数:作成したSQL文の配列
第2引数:OracleConnectionオブジェクト
<OracleDataAdapterクラス Fillメソッド>
引数であるデータテーブルに、OracleデータベースからSQL実行で取得したデータを格納する。
データテーブルは、$dtSet.Tables[要素番号]で指定する。(※本スクリプトでは、ForEachステートメントにおける$tbがこれに相当する)
<テーブル名称の取得>
テーブル名称は、$dtSet.Tables[要素番号].TableNameでゲットできるゼ!(※本スクリプトでは、ForEachステートメントにおける$tbがこれに相当する)
<データの参照>
$dtSet.Tables[要素番号]でようやく、データお目見えおめでとう!(※本スクリプトでは、ForEachステートメントにおける$tbがこれに相当する)
さて、以上で今回やりたかったことは達成できた。
では、これまで解説してきたソースをすべて以下に示す。
PowerShellスクリプト実行するゼ!!
#--------------------------------------
# Oracleデータベースへの接続
#--------------------------------------
#アセンブリのロード
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)
#データセットの作成
$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){
#OracleDataAdapterクラスを使用して、データの取得
$data = New-Object System.Data.OracleClient.OracleDataAdapter($strSQL[$i], $OraCon)
#Fillメソッドで、データセットのテーブルに取得データを格納
[void]$data.Fill($tb)
#テーブルのデータを表示
Write-Host ▼ $i 番目のテーブル -ForegroundColor Yellow
Write-Host $tb.TableName
$tb | Format-Table
$i++
}
Read-Host "×ボタンで終了"
次回はこのソースに手を加え、データベース接続におけるエラーハンドリングについて触れる予定である。
PowerShell、イエーイ!
PowerShell Oracleデータベースを操作しろ!#2 に続く
PowerShell プロファイルを利用しろ!#2
プロファイルを利用しろ!シリーズ第2弾です。
今回もよろしくお付き合いください。では始めます。
▼シリーズ第1弾はこちら
PowerShell プロファイルを利用しろ!#1 - 業務改善!Windows PowerShell入門
1.プロファイルの役割/目的
プロファイルとは、PowerShellが起動するときに実行されるスクリプトファイルである、ということをシリーズ第1弾で述べた。これはつまり、起動時にプロファイルに設定してある情報(環境情報)を読み込む仕様ということになる。
よって、このプロファイルに設定した内容をユーザは任意に呼び出し、利用することができる。俺は主に自作関数なんかを設定していて、コンソールでの作業をする場合、役立てている。
だが、どんなものを設定するかはあなた次第、君次第、変幻自在、無限大!
2.プロファイルはどこにあるんや?!
プロファイルの役割と目的はハッキリした。ではどこにあるんやと言う話になる。
単刀直入に言おう。此処にある。
プロファイルの場所を知りたくば、コンソールで以下を叩き込むべし!
$profile
プロファイルのフルパスが格納されている自動変数。
変数定義をせずとも、情報が格納されている。
3.プロファイルはどうやって作るんや?!
プロファイルの場所は分かったて、はよ、作り方を教えろ!
初めてプロファイルを作る場合は、コンソールで以下を叩き込むべし!
New-Item $profile -force -type file
<New-Itemコマンドレットとは>
名前の通り、アイテムを作成するコマンドレットだ。
今回はファイルを作成したいので、typeパラメータにfileを指定する。
※ちなみに、フォルダを作りたい場合はdirectoryを指定する。
<スイッチパラメータforceについて>
パスに含まれるフォルダが事前に作成されていない場合、通常はエラーになるが、forceを指定することで、これを回避することができる。
また、forceは既にファイルが存在している場合でも強制的に上書きされる。
4.プロファイルをどうやって編集するんや?
プロファイルのあるフォルダまで行って、ファイルを開いて書きたいことを書けば良い。
でも、それってめんどくせぇ!のですけど~。
プロファイルを編集する場合は、コンソールで以下を叩き込むべし!
notepad $profile
メモ帳が起動され、プロファイルの編集ができる。
PowerShellスクリプトファイルの関連付けプログラムはメモ帳である。(※以下を参照)
PowerShell スクリプトファイルを配布しろ!#2 - 業務改善!Windows PowerShell入門
起動後、以下の関数を記述し、保存する。
#プロファイルデビュー
Function Fn_Debut(){Write-Host 今日から君もプロファイルデビュー!}
5.プロファイルはどうやって使うんや?!
役割と目的で述べた通り、プロファイルはPowerShellの起動時に読み込まれる。
よって、読み込まれたならば、プロファイルの中身(今回の場合は関数)を呼び出すだけである。
なお、先ほど編集したプロファイルはまだ読み込まれていないので、一旦、コンソールを閉じること。
閉じた後、コンソールを再び立ち上げれば、読み込みされる。
コンソールで叩き込むべし!己のプロファイル
Fn_Debut
プロファイルに記述してあるFn_Debut関数を呼び出した。
見事、関数が実行された。
6.プロファイル使ってカッコつけは成功したのか?!
プロファイルを利用しろ!シリーズ第1弾で、いかにコンソール作業でカッコつけをするかに始まって、俺はプロファイルとの邂逅を果たした。
だが実際、仕事場でいざカッコつけの絶好のチャンス到来!というときはだいたい自分の端末ではない。
これ、すなわちプロファイルが登録していないので、プロファイルによる大技を披露することができないのである。
だが、それでいいのだ!
俺はそんな事で、くよくよする男ではない筈だ。
PowerShell、イエーイ !
PowerShell プロファイルを利用しろ!#1
1.はじまりの日
むかーし、むかーし、あるところにメガネ君という男がおった。
男はコマンドプロンプトという真っ黒の画面に、カタカタと一気呵成にコマンドを叩き込んで、何やらサクッと処理をかましていた。
そのコマンドが一体何だったのかは定かではないが、yj(俺の事)は、それを見て、
むちゃくちゃ、カッコええ!
俺もカッコつけてえ!
と心密かに思ったのであった。
時は流れ、yjもコマンドプロンプトを覚え、さらにはPowerShellも会得し、今ではメガネ君のよう叩き込めるようになった。
「今日もコマンドレットをかましやがるゼ!PowerShellのコンソールに。」
2.これ見よがしに叩き込め
人前でプログラムを何かサクッとやるには、だいだいやれる事は決まっている。
コンソールに、至極基本的なプログラムの組み合わせを、迷いもなく叩き込む。
そこにカッコよさを感じる俺は単細胞野郎か、とは思う。
けれども、あの頃抱いた初期衝動は大事にしていきたいと思うし、大袈裟かもしれないが、人生を歩むうえでの大きな原動力になり得ると信じて疑わない。
さて、PowerShellはパイプライン処理という恩恵によって、1ライナーでもそこそこのプログラムを書けるというのは以前にも書いた。
よって、よりカッコつけの幅が広がると俺は、勝手に思っている。
▼以下の過去記事を参照
PowerShell パイプラインを速習しろ! - 業務改善!Windows PowerShell入門
PowerShell 拡張子ごとのファイル数を取得しろ! - 業務改善!Windows PowerShell入門
スクリプトファイルを作って、あっという間に難しいことをやっつけるのも面白いが、コンソールに余裕綽綽で、コマンドレットを叩き込むのはもうロマンを感じずにはいられないゼ!
3.コアコマンドとプロファイル
フィギアスケートを例に挙げてみる。
基本の動きを組み合わせ、演技をしつつ、4回転ルッツ!3回転トーループとの連続ジャンプ!!
く~、魅せてくれやがるゼ!
俺はこれに着想した。
コアコマンドをかましつつ、最後にプロファイルを使って大技をぶちかます!
<コアコマンドとは>
簡単に言えば、使用頻度が超高い基本的なコマンドレット群。
PowerShellプロバイダーで使用するために設計された。
・ChildItem系統のコマンドレット
Get-ChildItemなど
・Content系統のコマンドレット
Get-Location、Set-Locationなど
・Path系統のコマンドレット
Join-Path、Test-Pathなど
他の系統もまだまだある。
Get-ChildItemについては、もはや殿堂モノだゼ!
<プロファイルとは>
簡単に言えば、PowerShellが起動するときに実行されるスクリプトファイル。
ではそれは一体、どんなスクリプトファイルなのか?!
プロファイルを利用しろ #2に続く
PowerShell スクリプトファイルを配布しろ!#3
帰ってきたゼ!この「スクリプトファイルを配布しろ!」シリーズ。
今回で第3弾だ。
第1弾のくそダサい方法から始って、第2弾ではスタイリッシュに進化を遂げた。
今回もスタイリッシュにいけるか?!
1.配布で重要視する点とは
さて、配布で重要視すべきを点を改めて確認したい。そう、実行ポリシーというものが存在するPowerShellにおいて。
いかに楽に実行してもらうか!
つまるところ、ダブルクリック実行ができるか否か。
しかし、ダブルクリック実行ができないPowerShellで、どうやってそれをクリアするか?そう、それこそがこの第3弾の命題だ。
2.どうやってダブルクリック実行するんや?!
ダブルクリック実行ができないなら、PowerShellでやることは諦める。できねぇものは仕方ねえゼ!
代わりに、PowerShellスクリプトを起動するためのスクリプトを、PowerShell以外で作ってしまえば良い。
今回はVBScriptを使用して起動用スクリプトを作り、配布するという例を取りあげてみたい。
3.VBScriptを用いた配布例
まずは、以下のようなフォルダ構成にする。
最終的にhogeフォルダだけまるごとコピーして配布すれば良いわけになる。
また、PowerShellスクリプト本体をScriptフォルダに入れておくのが俺的流儀である!
Run_hope.vbs
'====================================
' hope.ps1の起動用スクリプト
'====================================
Option Explicit
'FSOオブジェクト、Shellオブジェクト
Dim objFSO
Dim objShell
'VBSパス、VBS格納フォルダ、PS1パス
Dim strVBSPath
Dim strVBSFolder
Dim strPS1Path
'オブジェクト参照
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
'VBSパス、VBS格納フォルダ、PS1パス
strVBSPath = Wscript.ScriptFullName
strVBSFolder = objFSO.GetFile(StrVBSPath).ParentFolder
strPS1Path = strVBSFolder & "¥Script¥hope.ps1"
'PS1起動オプション
Const OPT = "Powershell -ExecutionPolicy ByPass -NoExit "
'PS1起動
objShell.Run OPT & strPS1Path
'オブジェクト解放
Set objFSO = Nothing
Set objShell = Nothing
'終了
Wscript.Quit
・単なる起動用スクリプトのくせに、VBScriptゆえに記述が冗長である。
しかし、一度これを作ってしまえば、使い回しが効くので、そこは見て見ぬ振りをするのが男というものだ、と俺は思ふ。
・起動用オプションは、いつもだいたいこれが多く、状況に応じてカスタムする。
PowerShell -ExecutionPolicy ByPass -NoExit
ByPass:実行ポリシーの一番緩いやつ。
NoExit:実行後、プロンプトは勝手に閉じない。
VBScriptをダブルクリックすると、「ラーメン食いてぇ!」と10回表示された。
PowerShell、イエーイ!
▼過去記事はこちら
acoustic-groove2.hatenablog.com
PowerShell 技術書に叫べ!
テレビで義務教育でのプログラミング必修化についてやっていた。
本屋にディズニーの絵本を買いに行くついでに、技術書のコーナーに寄るのだが、
「これ父さんの本!」
と、家にあるPowerShellの本と同じ本の前で、子供はいつも叫んでいる。
しかし、その本が書棚にない場合、必然的に叫んでくれないので、俺は寂しい。
PowerShell、オーノー!
PowerShell XMLファイルにアクセスしろ!
スクリプトを作っていると、入力用データをどうしても外部ファイルから読み込まねばならぬシーンがある。
また、それとは別に、外部ファイルに設定用データを書き込んでおいて、それを読み込んだ方が便利、或いは保守性が高いという場合もある。
では、PowerShellスクリプトにおいて、便利な読み込み用ファイルとは何か。
俺がよく使うのは以下の3種類である。
このうち今回はXMLファイルについて書きたいと思う。
どうして、書こうと思ったか?
アクセスが楽すぎるゼ!
これに尽きる。
楽ということはつまり、扱いが便利、開発効率が高いということになるだろう。
どうやってアクセスするんや!
PowerShellからXML文字列にアクセスするのは、スゲぇ簡単だ。
System.XML.XMLDocumentクラスのデータ型にキャストして、アクセスするだけ。
マジでこんだけ。あとはXMLの各要素を参照したり、追加したりするだけだ。
▼今回のお題で使うサンプルXML
config.xml
XMLの実態はテキストファイルだ。よって、通常の*.txtファイルと同様にGet-Contentコマンドレットで読み込み、[XML]データ型にキャストする。
では、特定の要素のみを参照する場合と、すべての要素を参照する例を示してみたい。
#XMLファイルの読み込みとキャスト
[XML]$xml = Get-Content "C:¥config.xml"
#型の確認
Write-Host "▼型の確認"
$xml.GetType()
Write-Host ""
#name要素の要素番号2のデータを表示
Write-Host "▼name要素の要素番号2のデータ"
$xml.root.data.name[2]
Write-Host ""
#すべての要素を表示
Write-Host "▼すべてのデータ"
ForEach($str in $xml.root.data){
Write-Host "---------------------"
Write-Host ("名前:" + $str.name)
Write-Host ("出身:" + $str.from)
Write-Host ("職業:" + $str.job)
}
Write-Host ""
Read-Host "×ボタンで終了"
・検証のため、型確認をした。
期待通り、System.XML.XMLDocumentクラスのデータ型であることが分かる。
・添え字指定により、特定の要素を参照することができる。1番目の要素番号は0となるので、今回の例の要素番号は2となる。
・ForEachステートメントを使用すると、すべての要素にアクセスすることができる。
かくも簡単にアクセスすることができた。
PowerShell、イエーイ!