Quantcast
Channel: PowerShellをはじめよう ~PowerShell入門~
Viewing all 30 articles
Browse latest View live

PowerShellでユーザーフォームを作る - データグリッドビュー編 -

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - データグリッドビュー編 -」です。

データグリッドビュー(DataGridView)はリストビューと似ていますが、どちらかと言うとOfficeソフトのExcelに近いと思います。

データグリッドビューの特徴は、
1.並び替え機能が付いていること
2.手動でアイテムを追加できること
3.行の高さや列幅を変更できること
4.行の表示/非表示が簡単であること などが挙げられます。

今回はそんなデータグリッドビューの基本的な部分をご紹介していきます。

<今回の完成品>



Excelのように見える部分がデータグリッドビューです。

それではスクリプトを記述していきます。

---------ここから-------------------------------------------------------------------------------------

# PowerShellでユーザーフォームを作る - データグリッドビュー編 -

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Size = "500,300"
$form.Text = "タイトル"

# データグリッドビュー
$Grid = New-Object System.Windows.Forms.DataGridView
$Grid.Size = "350,200"

# 列数を指定する
$Grid.ColumnCount = 3

# 列タイトルを指定する
$Grid.Columns[0].Name = "番号"
$Grid.Columns[1].Name = "氏名"
$Grid.Columns[2].Name = "性別"

# アイテムを追加する
$Item = "01","野比 のび太","男"
[void]$Grid.Rows.Add($Item[0],$Item[1],$Item[2])

$Item2 = "02","骨川 スネ夫","男"
[void]$Grid.Rows.Add($Item2[0],$Item2[1],$Item2[2])

$Item3 = "03","剛田 ジャイ子","女"
[void]$Grid.Rows.Add($Item3[0],$Item3[1],$Item3[2])

# 閉じるボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "400,230"
$Button.Size = "80,30"
$Button.Text  = "閉じる"
$Button.FlatStyle = "popup"
$Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

$form.Controls.AddRange(@($Grid,$Button))
$form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて実行すると上の画像と同じものが表示されるはずです。

それでは解説をしていきます。
また過去の記事で解説した部分については割愛致します。

内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************

# データグリッドビュー
$Grid = New-Object System.Windows.Forms.DataGridView
$Grid.Size = "350,200"

ここでは、DataGridViewクラスをインスタンス化し、Sizeプロパティを設定しています。
当然、他にもたくさんのプロパティがありますが、今回は基本編ということで、省略します。
今後、別の記事にまとめますので、その際はここにリンクを追加するようにします。


# 列数を指定する
$Grid.ColumnCount = 3

ここでは「列数の指定」を行っています。
これをしなければエラーとなり、以降の処理ができません。
つまり、事前にどういう表にしたいかを検討し、列数を決めておく必要があります。


# 列タイトルを指定する
$Grid.Columns[0].Name = "番号"
$Grid.Columns[1].Name = "氏名"
$Grid.Columns[2].Name = "性別"

列数を指定したあとは、タイトルを付けていきます。
Excelでいうと、「A」「B」「C」・・・の部分に相当します。


# アイテムを追加する
$Item = "01","野比 のび太","男"
[void]$Grid.Rows.Add($Item[0],$Item[1],$Item[2])

次にアイテムを追加していきます。
今回は$Itemという配列を作った上で各要素を追加していますが、別の方法でも追加は可能です。

# アイテムを追加する
$Item_A = "01"
$Item_B  ="野比 のび太"
$Item_C = "男"
[void]$Grid.Rows.Add($Item_A,$Item_B,$Item_C)

このように記述しても結果は同じです。

*******************************************************************************************************

解説は以上となります。

冒頭でも書いていますが、データグリッドビューはデフォルトで並び替え機能が付いています。
なので、「氏名」の部分をクリックすると順番が入れ替わります。

また、空白となっている最終行はアイテムを新規追加するのに使用しますし、すでに追加されているアイテムの各項目も自由に編集することができるようになっています。
(プロパティの設定で編集不可にしたり、新規追加行は非表示にすることも可能です)

データグリッドビューはリストビューよりも自由度が高いのが魅力ですので、様々な場面で活躍してくれると思います。

=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================


PowerShellでユーザーフォームを作る - サブフォーム編 -

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - サブフォーム編 -」です。

サブフォームは子フォームと言ったりもしますが、メインフォームとは別に表示させるフォームのことです。

サブフォームは開く方法や閉じる時などにいくつかの注意点があります。
その辺りについても詳しく、かつ分かりやすくご紹介していきたいと思います。

<今回の完成品>


ボタンも何もない方がサブフォームです。
メインフォームの「フォーム表示」ボタンを押すと表示されるようになっています。

それではスクリプトを記述していきます。

---------ここから-------------------------------------------------------------------------------------
# PowerShellでユーザーフォームを作る - サブフォーム編 -

Add-Type -AssemblyName System.Windows.Forms

# メインフォーム
$formA = New-Object System.Windows.Forms.Form
$formA.Size = "200,200"
$formA.StartPosition = "Manual"
$formA.Location = "0,0"
$formA.text = "メインフォーム"
$formA.MinimizeBox = $False
$formA.MaximizeBox = $False

#フォーム表示ボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,50"
$Button.size = "100,30"
$Button.text  = "フォーム表示"
$formA.Controls.Add($Button)

# サブフォーム
$formB = New-Object System.Windows.Forms.Form
$formB.Size = "200,300"
$formB.StartPosition = "manual"
$formB.Location = "200,0"
$formB.MaximizeBox = $False
$formB.MinimizeBox = $false
$formB.text = "サブフォーム"
$formB.Owner = $formA

# サブフォームのクロージングイベント
$Close = {
    $_.Cancel = $True
    $formB.Visible = $false
}
$formB.Add_Closing($Close)

#フォーム表示ボタンのクリックイベント
$Click = {
    $formB.Show()
}
$Button.Add_Click($Click)

#閉じるボタン
$CloseButton = New-Object System.Windows.Forms.Button
$CloseButton.Location = "50,100"
$CloseButton.size = "80,30"
$CloseButton.text  = "閉じる"
$CloseButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$formA.Controls.Add($CloseButton)

$FormA.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************

# サブフォーム
$formB = New-Object System.Windows.Forms.Form
$formB.Size = "200,300"
$formB.StartPosition = "manual"
$formB.Location = "200,0"
$formB.MaximizeBox = $False
$formB.MinimizeBox = $false
$formB.text = "サブフォーム"
$formB.Owner = $formA

まず最初にメインフォームとは別のフォームを作成するため、新しいFormクラスを$formBとして宣言します。
さらに各種プロパティを設定しているのですが、ここで大事なのが「Ownerプロパティ」です。

冒頭で触れましたが、サブフォームは別名「子フォーム」です。
つまりサブフォーム=子供であり、メインフォーム=親となります。
子供には必ず保護者が必要で、親がいないと子供は迷子になります。
Ownerプロパティは、「その子供の親はだれなのか?」を設定しています。
もしOwnerプロパティの記述がないと、メインフォームを閉じた時にサブフォームが取り残されて(=迷子になって)しまい、フリーズします。
なので、必ず記述するようにしましょう。


# サブフォームのクロージングイベント
$Close = {
    $_.Cancel = $True
    $formB.Visible = $false
}
$formB.Add_Closing($Close)

続いて、サブフォームのクロージングイベントを設定しています。
その内容は閉じようとしている操作をキャンセルし、かつ不可視状態(=存在はするけど見えない状態)にしています。
つまり、閉じたように見せかけて、実際は隠れただけということです。

なぜこのようなことをするかというと、サブフォームを普通に閉じた場合、もう一度表示させようとするとエラーが発生してしまうからです。
1度しか表示させないのであればこの記述は必要ありませんが、開く・閉じるを繰り返す場合は、この記述を入れましょう。


#フォーム表示ボタンのクリックイベント
$Click = {
    $formB.Show()
}
$Button.Add_Click($Click)

この記述は、メインフォームに設置されたボタンに対するクリックイベントになります。
ここではサブフォームを開いているのですが、「Show()」となっていることにご注目ください。
「ん?Showdialog()じゃないぞ?」と気づいたソコのアナタ!
グラッチェ!笑

フォームを表示させる方法には実はモードレスとモーダルの2種類があります。
モードレスの場合は「Show」を使用し、モーダルの場合は「Showdialog」を使用します。
2つの違いを簡単に説明しますと、次のようになります。

モードレス … フォームを表示させたらそのまま次の処理に移行する。
モーダル … フォームを表示させたら、そのフォームが閉じられるまで待機する。

体験した方が理解も早いと思いますので、実際に実験してみましょう。
まずは上記のサンプルスクリプトをそのまま実行し、サブフォームを表示させてください。(画像の状態)
サブフォームを開いたままで、メインフォームの「閉じる」ボタンを押すと、両フォームが閉じられます。

次に、$formB.Show() の部分を $formB.Showdialog() に変更した上で同じ操作をしてみてください。
閉じるボタンどころか、メインフォームが全然触れないと思います。

これがモードレスとモーダルの違いです。
なんとなくでもわかっていただけたでしょうか。

ここで一つ注意点があります。
それは「メインフォームは必ずShowdialog()とすること」です。
なぜならば、メインフォームをShow()でモードレス表示すると、表示と同時に次の行へ処理が進んでしまい、フリーズしてしまうからです。

以上のことから、メッセージボックスやインプットボックスのように何かしらの反応が必要な場合はモーダルで表示させ、次の処理に進まないようにするのがいいでしょう。
反対に、メインとは別に、常に表示させておきたいフォームがある場合はモードレスで表示させましょう。

*******************************************************************************************************

長くなってしまい、申し訳ありません。
最後まで読んでいただき、誠にありがとうございました。

オリジナルのアプリケーション作りが凝ってくると、サブフォームは意外と出番が多くなります。
例えば「設定ボタンを押すと設定フォームが開く」、「バージョンボタンを押すと情報フォームが開く」といった具合です。

メインフォームに様々なアイテム(ボタンやテキストボックスなど)を詰め込んでしまうと、せっかくいいモノができても、ちょっと使いづらくなってしまいます。
使用頻度が低いものなんかはサブフォームに入れるなどして、機能だけでなく、見た目も美しいアプリを作っていきましょう!

=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================

PowerShellでユーザーフォームを作る - トグルボタン編 -

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - トグルボタン編 -」です。

トグルボタンとはいわゆる「スイッチ」のようなもので、ONの状態とOFFの状態を見た目で判別できるようになります。

<今回の完成品>


上記の「はい」と書いてあるボタンがトグルボタンです。
ボタンを1度押すと次のように変化します。


それではスクリプトを記述していきます。

---------ここから-------------------------------------------------------------------------------------
# PowerShellでユーザーフォームを作る - トグルボタン編 -

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

# フォーム
$form = New-Object System.Windows.Forms.Form
$form.Size = "260,200"
$form.StartPosition = "CenterScreen"
$form.Text = "選択"
$form.TopLevel = $True
$form.MinimizeBox = $False
$form.MaximizeBox = $False

# ラベル1
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = "10,20"
$label1.Size = "160,30"
$label1.Text = "問1) あなたは男性ですか?"
$label1.TextAlign = "MiddleLeft"

# チェックボックス1
$CheckBox1 = New-Object System.Windows.Forms.CheckBox
$CheckBox1.location = "180,20"
$CheckBox1.size = "50,30"
$CheckBox1.Text = "はい"
$CheckBox1.TextAlign = "MiddleCenter"
$CheckBox1.Appearance = "Button"
$CheckBox1.FlatStyle = "System"
$change1 = {
    IF ( $CheckBox1.text -eq "はい")
    {
        $CheckBox1.text = "いいえ"
    }else{
        $CheckBox1.text = "はい"
    }
}
$CheckBox1.Add_CheckedChanged($change1)

# ラベル2
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = "10,60"
$label2.Size = "160,30"
$label2.Text = "問2) あなたは10代ですか?"
$label2.TextAlign = "MiddleLeft"

# チェックボックス2
$CheckBox2 = New-Object System.Windows.Forms.CheckBox
$CheckBox2.location = "180,60"
$CheckBox2.size = "50,30"
$CheckBox2.Text = "はい"
$CheckBox2.TextAlign = "MiddleCenter"
$CheckBox2.Appearance = "Button"
$CheckBox2.FlatStyle = "System"
$change2 = {
    IF ( $CheckBox2.text -eq "はい")
    {
        $CheckBox2.text = "いいえ"
    }else{
        $CheckBox2.text = "はい"
    }
}
$CheckBox2.Add_CheckedChanged($change2)

# OKボタン
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "30,120"
$OKButton.Size = "75,30"
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK

# キャンセルボタン
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = "130,120"
$CancelButton.Size = "75,30"
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

# フォームにアイテムを追加
$form.Controls.AddRange(@($label1,$label2,$CheckBox1,$CheckBox2,$OKButton,$CancelButton))

# フォームを表示
$result = $Form.ShowDialog()

if( $result -eq "OK" )
{
    [System.Windows.Forms.MessageBox]::Show("回答ありがとうございました", "<感謝>")
}
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付け後、任意のファイル名で保存してください。
保存したps1ファイルを右クリックし、「PowerShellで実行」をクリックすると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************

# チェックボックス1
$CheckBox1 = New-Object System.Windows.Forms.CheckBox
$CheckBox1.location = "180,20"
$CheckBox1.size = "50,30"
$CheckBox1.Text = "はい"
$CheckBox1.TextAlign = "MiddleCenter"
$CheckBox1.Appearance = "Button"
$CheckBox1.FlatStyle = "System"

まず最初に申し上げておきたいのは、「”ToggleButtonクラス”なんてものはない!」ということです。
トグルボタンを実装するには、「CheckBoxクラス」を使用します。
チェックの有無=ON/OFFの状態と同じということですね。

この記述では、CheckBoxクラスをインスタンス化しています。
さらにAppearanceプロパティの値を「Button」に設定しています。
こうすることで、チェックボックスの見た目が通常の□からボタンに変化します。


$change1 = {
    IF ( $CheckBox1.text -eq "はい")
    {
        $CheckBox1.text = "いいえ"
    }else{
        $CheckBox1.text = "はい"
    }
}
$CheckBox1.Add_CheckedChanged($change1)

続いて、チェックボックスのイベントを設定しています。
イベントの発生するタイミングは「チェック状態が変化した時」です。
今回はチェックボックスの見た目をボタンにしていますので、感覚的には「ボタンを押した時」となります。
イベントの内容としては、ボタンの(チェックボックスの)テキストが「はい」のときは「いいえ」に変更し、「いいえ」のときは「はい」に変更するものです。

*******************************************************************************************************
解説は以上となります。

トグルボタンの特徴としては、「選択されているかどうか」を簡単に判別できるところにあります。

たとえば、トグルボタンとフォームの背景色を連携させて、「ONのときは背景が赤くなり、OFFのときは通常色になる」といった使い方もできます。

同じチェックボックスでも、□のものは押しにくい・見にくいと思われる使用者もいるかもしれません。
そんなときは、トグルボタンを一度検討されてみてはいかがでしょうか。

=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================

PowerShellでユーザーフォームを作る - ツリービュー編 -

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - ツリービュー編 -」です。

ツリービューはリストボックスやリストビューなどと同じ「リスト系コントロール」のひとつです。


ツリービューの代表的な使用例といえば、上記のようなフォルダの階層表示が有名です。

<今回の完成品>

展開時と折り畳み時

それではスクリプトを記述していきます。

---------ここから-------------------------------------------------------------------------------------
# PowerShellでユーザーフォームを作る - ツリービュー編 -

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

$form = New-Object System.Windows.Forms.Form
$form.Size = "200,300"
$form.StartPosition = "CenterScreen"
$form.Text = "TreeView"

# TreeViewクラス
$TreeView = New-Object System.Windows.Forms.TreeView
$TreeView.Location = "10,10"
$TreeView.Size = "150,200"

# 親ノードを入れる
[void]$TreeView.Nodes.Add("親1")
[void]$TreeView.Nodes.Add("親2")
[void]$TreeView.Nodes.Add("親3")

# 子ノードを入れる
[void]$TreeView.Nodes[0].Nodes.Add("子1")
[void]$TreeView.Nodes[0].Nodes.Add("子2")
[void]$TreeView.Nodes[2].Nodes.Add("子3")

# 孫ノードを入れる
[void]$TreeView.Nodes[0].Nodes[0].Nodes.Add("孫1")

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,220"
$Button.Size = "80,30"
$Button.Text  = "開く"
$open_close = {
    if ( $Button.Text -eq "開く")
    {
        $TreeView.ExpandAll()
        $button.Text = "閉じる"
    }else{
        $TreeView.CollapseAll()
        $button.Text = "開く"
    }
}
$Button.Add_Click($open_close)

$form.Controls.AddRange(@($TreeView,$Button))
$Form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付け後、実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************

# TreeViewクラス
$TreeView = New-Object System.Windows.Forms.TreeView
$TreeView.Location = "10,10"
$TreeView.Size = "150,200"

まずはじめに、TreeViewのインスタンス化(使用するための宣言)を行います。
さらにLocationプロパティで配置位置を、Sizeプロパティで大きさを指定しています。


# 親ノードを入れる
[void]$TreeView.Nodes.Add("親1")
[void]$TreeView.Nodes.Add("親2")
[void]$TreeView.Nodes.Add("親3")

ツリービューはノードと言われる要素で形成され、ノードが枝分かれするようにつながっていきます。

今回は分かりやすいように「親ノード」「子ノード」「孫ノード」という表現にしてみました。

ここでは親ノードを3つ作成しています。


# 子ノードを入れる
[void]$TreeView.Nodes[0].Nodes.Add("子1")
[void]$TreeView.Nodes[0].Nodes.Add("子2")
[void]$TreeView.Nodes[2].Nodes.Add("子3")

続いて、親ノードに子ノードを追加しています。
親ノードはインデックス番号で指定します。


# 孫ノードを入れる
[void]$TreeView.Nodes[0].Nodes[0].Nodes.Add("孫1")

さらに子ノードに孫ノードを追加しています。
親ノードと子ノードをインデックス番号で指定しています。


$open_close = {
    if ( $Button.Text -eq "開く")
    {
        $TreeView.ExpandAll()
        $button.Text = "閉じる"
    }else{
        $TreeView.CollapseAll()
        $button.Text = "開く"
    }
}
$Button.Add_Click($open_close)

この記述はボタンのクリックイベントを示しています。
イベントの内容は「ボタンを押した時、ボタンの文字が『開く』の場合はツリービューを全て展開し、ボタンの文字を『閉じる』に変える。『開く』以外の文字の場合はツリービューを全て折り畳み、ボタンの文字を『開く』に変える」というものです。

ツリービューはExpandAll()メソッドで一括展開、CollapseAll()メソッで一括折り畳みをすることができます。


ここで、使用頻度が高そうなプロパティをいくつかご紹介致します。

●各ノードをつなぐ線を表示しない。
$TreeView.ShowLines = $False

●親ノードをつなげる線を表示しない。
$TreeView.ShowRootLines = $False

●分岐のあるノードに付属する+ボタン-ボタンを表示しない。
$TreeView.ShowPlusMinus = $False
→ 項目をダブルクリックすれば、展開/折り畳みが可能

●選択中のノードの情報を取得する
$TreeView.SelectedNode

●親ノードの全ての情報を取得する
$TreeView.Nodes

●親1ノードの個別の情報を取得する
$TreeView.Nodes.Item(0)

●親1ノードの子ノードの情報を全て取得する
$TreeView.Nodes.Item(0).Nodes

●子1ノードの情報を取得する
$TreeView.Nodes.Item(0).Nodes.Item(0)

●孫1ノードの情報を取得する
$TreeView.Nodes.Item(0).Nodes.Item(0).Nodes.Item(0)

※情報を取得する際は、最後に取得したい項目を指定することで、特定の情報だけを得ることができる。
例えば…$TreeView.Nodes を $TreeView.Nodes.Text とすれば、「親1 親2 親3」の結果が返る。

●ツールチップの表示を許可する
$TreeView.ShowNodeToolTips =$True

●子2ノードにツールチップを設定する
$TreeView.Nodes.Item(0).Nodes.Item(1).ToolTipText = "子2ノードです"

他にもプロパティやメソッドは多くありますので、詳細はTreeViewクラスを参照ください。
*******************************************************************************************************

解説は以上となります。

ツリービューはリストビューやデータグリッドビューと比べると使用頻度が低いかもしれません。
階層表示を必要とする機会が今までほとんどありませんでした。(汗

もし、階層表示が必要となった場合は、ぜひご参考ください。

=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================

PowerShell ドラッグ&ドロップでListViewの項目を移動させる

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は以前ご紹介したリストビューを少し発展させて、ドラッグ&ドロップで項目を移動できるようにしたいと思います。

リストビューについて詳しく知りたい方はコチラをご参照ください。

<今回の完成品>


早速スクリプトを記述していきます。
少々長いですが、ご了承ください。

---------ここから-------------------------------------------------------------------------------------
# ListView ドラッグ&ドロップで項目を移動させる
Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Size = "400,230"
$form.StartPosition = "CenterScreen"
$form.Text = "リストビュー"

# ListView
$View = New-Object System.Windows.Forms.ListView
$View.Location = "10,10"
$View.Size = "360,130"
$View.View = "Details"
$View.GridLines = $True
$View.AllowDrop = $True
$View.MultiSelect = $False # 複数選択:不可

#アイテムドラッグイベント
$DragItem = {
    $View.DoDragDrop($_.Item, "Move" )
}
$View.Add_ItemDrag($DragItem)

#ドラッグエンターイベント
$Enter = {
    $_.Effect = "Move"
    $script:name = $View.SelectedItems.SubItems[0].Text #ファイル名
    $script:page = $View.SelectedItems.SubItems[1].Text #ページ数
    $script:size = $View.SelectedItems.SubItems[2].Text #サイズ
    $script:index = $View.SelectedItems.Index #インデックス番号
}
$View.Add_DragEnter($Enter)

#ドラッグオーバーイベント
$Over = {
    #マウスポインタの座標から、どの項目の上に移動しているか判断する
    $where = New-Object System.Drawing.Point($_.X , $_.Y)
    $point = $View.PointToClient($where)
    $OverItem = $View.GetItemAt($point.X,$point.Y)

    #ドラッグオーバーしている項目を選択状態にする。
    $select = $View.Items.IndexOf($OverItem)
    
    IF ( -Not ( $select -eq "-1" ) )
    {
        $OverItem.Selected = $True
    }
    
    #インデックス番号を一時保管
    $script:index2 = $select
}
$View.Add_DragOver($Over)

#ドラッグドロップイベント
$Drop = {
    $Element_Name = $name
    $Element_Page = $page
    $Element_Size = $size
    $Element_Index = [int32]$index

    #移動先のインデックス番号から分岐
    IF ( $index2 -eq "-1" ) #「-1」の場合は最後尾に設定
    {
        $After_Index = $View.Items.Count
    }else{ #「-1」以外の場合は、選択した項目のインデックスに設定
        $After_Index = $View.SelectedItems.Index
    }

    # 項目の移動を実行
    $Item = New-Object System.Windows.Forms.ListViewItem("$Element_Name") # ファイル名
    [void]$Item.SubItems.Add("$Element_Page") # ページ数
    [void]$Item.SubItems.Add("$Element_Size") # サイズ
    [void]$View.Items.Insert($After_Index,$Item)

    #移動元の項目 > 移動先の項目 の場合は、移動元インデックスに+1する
    IF ( $Element_Index -gt $After_Index ) { $Element_Index += 1 }
    
    #元の項目を削除
    $View.Items[$Element_Index].Remove()

    #移動した項目を選択する
    $Item.Selected = $True
}
$View.Add_DragDrop($Drop)

# リストビューにヘッダーを追加
[void]$View.Columns.Add("ファイル名",150)
[void]$View.Columns.Add("ページ数",100)
[void]$View.Columns.Add("サイズ",100)

#項目を追加======================================================
$Item1 = New-Object System.Windows.Forms.ListViewItem("ファイルA.pdf") 
[void]$Item1.SubItems.Add("3")
[void]$Item1.SubItems.Add("0.26")
[void]$View.Items.Add($Item1)

$Item2 = New-Object System.Windows.Forms.ListViewItem("ファイルBB.pdf")
[void]$Item2.SubItems.Add("50")
[void]$Item2.SubItems.Add("6.90")
[void]$View.Items.Add($Item2)

$Item3 = New-Object System.Windows.Forms.ListViewItem("ファイルCCC.pdf")
[void]$Item3.SubItems.Add("23")
[void]$Item3.SubItems.Add("1.50")
[void]$View.Items.Add($Item3)

$Item4 = New-Object System.Windows.Forms.ListViewItem("ファイルDDDD.pdf")
[void]$Item4.SubItems.Add("100")
[void]$Item4.SubItems.Add("5.03")
[void]$View.Items.Add($Item4)
#============================================================

# 閉じるボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "290,150"
$Button.size = "80,30"
$Button.text  = "閉じる"
$Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

$form.Controls.AddRange(@($View,$Button))
$form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付け後、実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************

項目の移動は、簡単なようで実は結構複雑です。
手順としてはおおまかに次の4イベントを実施しなくてはいけません。

  1.アイテムドラッグイベント
  2.ドラッグエンターイベント
  3.ドラッグオーバーイベント
  4.ドラッグドロップイベント

特に3.ドラッグオーバーイベントでは、「マウスポインタの座標から、どの項目の上にポインタがあるのかを判断する」といった処理が必要となります。
(この辺のサンプルがほとんど無く、当時は結構苦労しました)


# アイテムドラッグイベント
$DragItem = {
    $View.DoDragDrop($_.Item, "Move" )
}
$View.Add_ItemDrag($DragItem)

まずはアイテムドラッグイベントです。
発生タイミングは「項目をドラッグした時」です。
ここではDoDragDropメソッドを用いてドラッグ&ドロップの操作を開始し、ItemDragEventArgsクラスのプロパティをItemとして、DragDropEffect列挙体にMoveを指定しています。

これを要約すると、「さぁ、これからみんなで旅行にいこう!お弁当(アイテムのデータ)を持って!手段はそうだな・・・車(コピー)・・・いや、電車(移動)にしよう!」
こんなイメージでしょうか・・・。


# ドラッグエンターイベント
$Enter = {
    $_.Effect = "Move"
    $script:name = $View.SelectedItems.SubItems[0].Text #ファイル名
    $script:page = $View.SelectedItems.SubItems[1].Text #ページ数
    $script:size = $View.SelectedItems.SubItems[2].Text #サイズ
    $script:index = $View.SelectedItems.Index #インデックス番号
}
$View.Add_DragEnter($Enter)

続いてドラッグエンターイベントです。
発生タイミングは「ドラッグ状態でマウスポインタがリストビュー内に入ってきた時」です。
ここでは、現在選択中の(=ドラッグ中の)項目について、各Text情報を取得し、変数に格納しています。
変数のスコープを「script」にするのを忘れないようにしてください。
そうしないと、ドラッグエンターイベントが終わった瞬間に、その変数は参照できなくなります。

この処理を要約すると「出発の準備はできたか?!持っていくものは"ファイル名"と"ページ数"と"サイズ"と"インデックス番号"だぞ!」


#ドラッグオーバーイベント
$Over = {
    #マウスポインタの座標から、どの項目の上に移動しているか判断する
    $where = New-Object System.Drawing.Point($_.X , $_.Y)
    $point = $View.PointToClient($where)
    $OverItem = $View.GetItemAt($point.X,$point.Y)

    #ドラッグオーバーしている項目を選択状態にする。
    $select = $View.Items.IndexOf($OverItem)
    
    IF ( -Not ( $select -eq "-1" ) )
    {
        $OverItem.Selected = $True
    }
    
    #インデックス番号を一時保管
    $script:index2 = $select
}
$View.Add_DragOver($Over)

次にドラッグオーバーイベントです。
発生タイミングは「ドラッグ中のマウスポインタがリストビューの上にある時」です。
ここでは、まずマウスポインタの画面上の座標を取得し(変数where)、その座標をリストビュー内での座標(クライアント座標)に当てはめます。(変数point)
そして、クライアント座標に合致するアイテムを取得します。(変数OverItem)
その後、オーバーされているアイテムのインデックス番号を取得し、その番号が「-1」以外の場合はそのアイテムを選択している状態にします。
この「-1」とは「アイテムが何もない場所」であることを示しています。
最後に、オーバーされているアイテムのインデックス番号を変数index2に格納しています。

この処理を要約すると「今いる地点は東経***北緯***だから、日本地図でいうとこの辺りだな。つまり、○○施設があるところだ!よし、到着記念に色を塗っておこう!将来のために、その地点も覚えておくんだぞ!」

# ドラッグドロップイベント
$Drop = {
    $Element_Name = $name
    $Element_Page = $page
    $Element_Size = $size
    $Element_Index = [int32]$index

    #移動先のインデックス番号から分岐
    IF ( $index2 -eq "-1" ) #「-1」の場合は最後尾に設定
    {
        $After_Index = $View.Items.Count
    }else{ #「-1」以外の場合は、選択した項目のインデックスに設定
        $After_Index = $View.SelectedItems.Index
    }

    # 項目の移動を実行
    $Item = New-Object System.Windows.Forms.ListViewItem("$Element_Name") # ファイル名
    [void]$Item.SubItems.Add("$Element_Page") # ページ数
    [void]$Item.SubItems.Add("$Element_Size") # サイズ
    [void]$View.Items.Insert($After_Index,$Item)

    #移動元の項目 > 移動先の項目 の場合は、移動元インデックスに+1する
    IF ( $Element_Index -gt $After_Index ) { $Element_Index += 1 }
    
    #元の項目を削除
    $View.Items[$Element_Index].Remove()

    #移動した項目を選択する
    $Item.Selected = $True
}
$View.Add_DragDrop($Drop)

いよいよドラッグドロップイベントです。
発生タイミングは「アイテムをドロップした時」です。
まずドラッグエンターイベントの時に取得していたものを改めて変数に入れ直しています。(必須ではありません。自身が分かりやすくするためにしたことです)
続いて、移動先のインデックス番号を確定させます。
ドラッグオーバーイベント時の、オーバされていたアイテムのインデックス番号によって分岐させています。
移動先を確定後、リストビューにドラッグしていたアイテムを挿入します。
この時点では、移動前のアイテムが残ったままになってしまいますので、移動前のアイテムを削除する処理を入れています。
この時、移動前のインデックス番号が移動先のインデックス番号よりも大きい場合はインデックス番号がひとつズレてしまうことに注意してください。
(インデックス3のアイテムをドラッグし、インデックス2の部分に挿入したとき、元のアイテムのインデックス番号は3から4になります)
最後に、移動後のアイテムを選択状態にして完了です。

*******************************************************************************************************
解説は以上となります。

最後まで読んでいただき、誠にありがとうございました!

GUI上で見るとなんてことない動作なのですが、その裏ではこんなに複雑な処理になっています。

手動での並び替えができるようになると、操作の幅がグッと広がります。
これまでに作成されたリストビューがあるのであれば、今回の機能を追加することをご検討してみてはいかがでしょうか。
=======================================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================

PowerShellでユーザーフォームを作る - 設定ファイル 読み込み編 -

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - 設定ファイル 読み込み編 -」です。

あなたが作成したユーザーフォームを、例えば同じ社内の人が複数人で使用していたりしませんか?

そして、使用する人(パソコン)によってフォルダのパスが違ったり、ファイル名が違ったり、文字色が違ったりと、十人十色の状況になっていませんか?

使う人が2~3人と少ないような場合は、「スクリプト内でユーザーIDなどから処理を分岐させる」「一人ずつスクリプトを作る」などの方法でも問題ないかもしれませんが、それが10人、20人となってくると大変です。

そういった場合に使用するのが「設定ファイル」です。

設定ファイル内には個別の情報を予め入力しておく必要があります。
その設定ファイルとスクリプトファイルを同じフォルダ内に格納しておき、スクリプトを実行したときに設定ファイル内を読み込むことで、それぞれの設定が反映されます。

<今回の完成品>


設定ファイルではiniファイルやxmlファイルがよく使われますが、今回はxmlファイルを使ってご紹介していきます。

まず先にxmlファイルを準備します。

今回使用するxmlファイルの内容は次のようになっています。

- - - [ setting.xml ] - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<?xml version="1.0" encoding="utf-8"?>
<root>
    <name>山田太郎</name>
    <userid>t_yamada</userid>
    <path>C:\Users\t_yamada\Desktop</path>
    <color>lightblue</color>
</root>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

続いて、スクリプトを記述していきます。

---------ここから-------------------------------------------------------------------------------------
#PowerShellでユーザーフォームを作る - 設定ファイル 読み込み編 -

#xmlファイルの読み込み
$xml = [XML](Get-Content "setting.xml") 

#それぞれを取得し、変数へ格納
$xml_name = $xml.root.name 
$xml_id = $xml.root.userid 
$xml_path = $xml.root.path 
$xml_color = $xml.root.color 

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

#フォーム 
$form = New-Object System.Windows.Forms.Form 
$form.Size = "300,200" 
$form.StartPosition = "CenterScreen" 
$form.Text = "設定" 
$form.BackColor = $xml_color 

#ラベル 名前 
$NameLabel = New-Object System.Windows.Forms.Label 
$NameLabel.Location = "10,10" 
$NameLabel.Size = "100,20" 
$NameLabel.Text = "名前" 

#テキストボックス 名前 
$Name = New-Object System.Windows.Forms.TextBox 
$Name.Location = "10,30"
$Name.Size = "250,20" 
$Name.Text = $xml_name 

#ラベル アカウントID 
$IDLabel = New-Object System.Windows.Forms.Label 
$IDLabel.Location = "10,60" 
$IDLabel.Size = "100,20" 
$IDLabel.Text = "アカウントID" 

#テキストボックス ID 
$ID = New-Object System.Windows.Forms.TextBox 
$ID.Location = "10,80" 
$ID.Size = "250,20"
$ID.Text = $xml_id 

#ラベル パス 
$PathLabel = New-Object System.Windows.Forms.Label 
$PathLabel.Location = "10,110" 
$PathLabel.Size = "100,20" 
$PathLabel.Text = "パス" 

#テキストボックス パス 
$Path = New-Object System.Windows.Forms.TextBox 
$Path.Location = "10,130"
$Path.Size = "250,20" 
$Path.Text = $xml_path

$form.Controls.AddRange(@($NameLabel,$Name,$IDLabel,$ID,$PathLabel,$Path))

$Form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------
上記内容をコピーし、PowerShell ISEに貼り付け後、実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。


*****解説*****************************************************************************

#xmlファイルの読み込み 
$xml = [XML](Get-Content "setting.xml")

ここでは、カレントディレクトリ内にあるsetting.xmlを読み込み、変数xmlに格納しています。
これで、設定ファイルの内容は全て変数xmlファイルに収められました。


#それぞれを取得し、変数へ格納
$xml_name = $xml.root.name 
$xml_id = $xml.root.userid 
$xml_path = $xml.root.path 
$xml_color = $xml.root.color

続いて、変数xmlの中から必要な部分だけを個別に取り出していきます。

例えば、変数xml_nameでは、設定ファイル内の"root"の中の"name"の値(つまり「山田太郎」)を取得しています。
同様に他の値を取得し、それぞれを変数に格納しています。

今回の例では、取得した値をフォーム背景色とそれぞれのテキストボックスの文字列にそのまま当てはめています。

************************************************************************************************

解説は以上となります。

設定ファイルは最初に準備さえしておけば、後の管理が非常に楽になります。
例えば、「今まで使っていたフォルダを別のフォルダに変更したい」といった場合も、その人の設定ファイル内を書き換えるだけで済みますし、新たにそのツールを使用する人が増えた場合も、設定ファイルだけを編集すればすぐに使えるようになります。

貴殿が作成したユーザーフォームを多くの方が使用する場合は、ぜひ設定ファイルを導入しましょう!

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=============================================================

PowerShellでxmlファイルを操作する - 書き込み(保存)編 -

$
0
0
PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - 設定ファイル 書き込み(保存)編 -」です。

以前の記事で設定ファイルを読み込む方法をご紹介致しました。
PowerShellでユーザーフォームを作る - 設定ファイル 読み込み編 -

しかし、設定ファイルの内容は読み込むばかりではなく、書き込んでナンボですね。

よって、今回は「読み込み編」で使用したものを流用し、新しい内容を書き込み(保存)まで行う方法をご紹介していきます。

使用するxmlファイルの内容は前回と同じく下記の通りです。

 [ setting.xml ]
<?xml version="1.0" encoding="utf-8"?>
<root>
    <name>山田太郎</name>
    <userid>t_yamada</userid>
    <path>C:\Users\t_yamada\Desktop</path>
    <color>lightblue</color>
</root>
 続いてスクリプトを記述していきます。
# PowerShellでユーザーフォームを作る - 設定ファイル 書き込み(保存)編 -

# xmlの事前処理 = = = = = = = = = = = = = = = = = = = = = = = = = #
#xmlファイルのパス
$xmlPath = "setting.xml"

#xmlファイルの読み込み
$xml = [XML](Get-Content $xmlPath)

#それぞれを取得し、変数に格納しておく
$AAA = $xml.root.name
$BBB = $xml.root.userid
$CCC = $xml.root.path
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = #

#アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#フォームの作成
$form = New-Object System.Windows.Forms.Form
$form.Size = "380,200"
$form.startposition = "centerscreen"
$form.text = "設定"

#「名前」- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$NameLabel = New-Object System.Windows.Forms.Label
$NameLabel.Location = "10,10"
$NameLabel.Size = "100,20"
$NameLabel.Text = "名前"

$Name = New-Object System.Windows.Forms.TextBox
$Name.Location = "10,30"
$Name.Size = "250,20"
$Name.Text = $AAA

#「アカウントID」- - - - - - - - - - - - - - - - - - - - - - - - -
$IDLabel = New-Object System.Windows.Forms.Label
$IDLabel.Location = "10,60"
$IDLabel.Size = "100,20"
$IDLabel.Text = "アカウントID"

$ID = New-Object System.Windows.Forms.TextBox
$ID.Location = "10,80"
$ID.Size = "250,20"
$ID.Text = $BBB

#「パス」- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$PathLabel = New-Object System.Windows.Forms.Label
$PathLabel.Location = "10,110"
$PathLabel.Size = "100,20"
$PathLabel.Text = "パス"

$Path = New-Object System.Windows.Forms.TextBox
$Path.Location = "10,130"
$Path.Size = "250,20"
$Path.Text = $CCC

# 設定保存ボタン- - - - - - - - - - - - - - - - - - - - - - - - -
$SaveButton = New-Object System.Windows.Forms.Button
$SaveButton.Location = "280,120"
$SaveButton.Size = "80,30"
$SaveButton.Text = "設定保存"
$SaveButton.FlatStyle = "Flat"
$SaveButton.BackColor = "lightblue"

# 設定保存ボタンのクリックイベント
$Save = {
# 配列を作成
$array = ("name", "userid", "path") # 変更箇所
$new_text = ($Name.Text, $ID.Text, $Path.Text) # 新しい要素

# XpathNavigatorの作成
$Navi = [XML.Xpath.XpathNavigator] $xml.CreateNavigator()

For ( $a = 0 ; $a -lt $array.Count ; $a++ )
{
# 変更する場所
$position = $array[$a]

# 新しい要素
$text = $new_text[$a]

# 変更する場所を指定
$Nodes = $Navi.Select("/root/$position")

# 値を変更
while ( $Nodes.MoveNext() )
{
$Nodes.Current.SetValue("$text")
}
}

# xmlファイルを上書き保存
$xmlSetting = New-Object System.Xml.XmlWriterSettings
$xmlSetting.Indent = $True
$xmlWriter = [System.Xml.XmlWriter]::Create($xmlPath,$xmlSetting)
$Navi.MoveToRoot()
$Navi.WriteSubtree($xmlWriter)
$xmlWriter.Close()

[System.Windows.Forms.MessageBox]::Show("保存されました", "保存完了")
}
$SaveButton.Add_Click($Save)

$form.Controls.AddRange(@($NameLabel,$Name,$IDLabel,$ID,$PathLabel,$Path,$SaveButton))
$Form.Showdialog()

上記内容をコピーし、PowerShell ISEに貼り付け後、実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。  内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説***********************************************************
今回の内容は、上記スクリプト中のクリックイベント内の記述が対象ですので、その部分に絞って解説を行います。
# XpathNavigatorの作成
$Navi = [XML.Xpath.XpathNavigator] $xml.CreateNavigator() 
ここではXpathNavigatorクラスを使用することで、XMLファイルを操作しやすくします。
XpathNavigatorクラスについては長くなってしまうので、より深く知りたい場合は各自で調査をお願いします。
とりあえず今は「XMLファイルを編集するための準備」と思っておけば差し支えありません。

For ( $a = 0 ; $a -lt $array.Count ; $a++ )
{
# 変更する場所
$position = $array[$a]

# 新しい要素
$text = $new_text[$a]

# 変更する場所を指定
$Nodes = $Navi.Select("/root/$position")

# 値を変更
while ( $Nodes.MoveNext() )
{
$Nodes.Current.SetValue("$text")
}
}
ここでは事前に作成しておいた配列の数だけForループを行い、要素を書き換えています。
手順としては、変更する場所を指定し、新しい要素を指定します。
while文内のSetValueの部分で要素を書き換えています。

# xmlファイルを上書き保存
$xmlSetting = New-Object System.Xml.XmlWriterSettings
$xmlSetting.Indent = $True
$xmlWriter = [System.Xml.XmlWriter]::Create($xmlPath,$xmlSetting)
$Navi.MoveToRoot()
$Navi.WriteSubtree($xmlWriter)
$xmlWriter.Close()
最後にXMLファイルを保存して終了です。
今回はインデントをつけるため、IndentプロパティをTrueにしていますが、必要ない場合は記述しなくても大丈夫です。
最後に必ず$xmlWriterを閉じるのを忘れないようにしてください。
********************************************************************

解説は以上となります。
今回はあまり解説になっていなくて申し訳ありません。

PowerShellでは、xmlファイルの読み込みは簡単なのですが、書き込みは面倒で、長くて、スマートではありません。
正直な話、xmlファイルの操作を私自身も完璧に覚えているかと言われると、答えは「No」です。毎回コピペですw
しかし、設定ファイルを扱う上で、書き込み処理は絶対に必要となりますので、知っておいて損はないと思います。

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!
=============================================================

PowerShellでマウスポインタの座標を取得する

$
0
0
PowerShellでユーザーフォームを作っていると、ふと、マウスポインタの座標を取得したくなることがあります。

例えば、「コンテキストメニューを表示させるために座標を取得する」といった場合が当てはまります。

よって今回のテーマは「PowerShellでマウスポインタの座標を取得する」です。

<今回の完成品>


今回の完成品は、ボタンのみで構成されたフォームを使用します。
ボタンをクリックすると1秒ごとにマウスポインタの現在座標を取得し、コンソールに出力します。
10回取得を繰り返したところで終了します。

以下がスクリプトとなります。
# PowerShellでマウスポインタの座標を取得する

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

# フォームの作成・ボタンの作成
$form = New-Object System.Windows.Forms.Form
$form.Size = "200,200"
$form.StartPosition = "CenterScreen"

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,50"
$Button.Size = "100,50"
$Button.Text = "クリック!"

# クリックイベント
$click = {
for ( $a = 0 ; $a -lt 10 ; $a++ )
{
$x = [System.Windows.Forms.Cursor]::Position.X # マウスのX座標
$y = [System.Windows.Forms.Cursor]::Position.Y # マウスのY座標
Write-Host "マウスの現在座標は($x,$y)です"
Start-Sleep(1)
}
Write-Host "終わり"
}
$Button.Add_Click($click)

$form.Controls.Add($Button)
$Form.Showdialog()
上記内容をコピーし、PowerShell ISEに貼り付け後、実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。  内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

* * * * * 解説 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ここではマウスポインタの座標取得の部分のみをピックアップします。
$x = [System.Windows.Forms.Cursor]::Position.X # マウスのX座標
$y = [System.Windows.Forms.Cursor]::Position.Y # マウスのY座標
Write-Host "マウスの現在座標は($x,$y)です"
マウスポインタの座標を取得するには、System.Windows.Forms.CursorクラスのPositionプロパティを利用します。

今回はわかりやすくX座標とY座標を分けて取得しましたが、次のように記述することで同時に取得することも可能です。
$p = [System.Windows.Forms.Cursor]::Position
このように記述した場合、{X=1000,Y=500} というように出力されます。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

解説は以上となります。

冒頭でも書きましたが、コンテキストメニューと組み合わせると便利&洒落た使い方ができると思います。
ぜひ一度、実装を検討してみてください。

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!
=============================================================

[PowerShell] 変数に変数を使う

$
0
0
PowerShellだけでなく、どんなプログラムでも変数は必ず使用します。

PowerShellでは事前の宣言なく使用できる変数ですが、時折、連番で変数を取りたい場合があります。

(例)
$hensu01
$hensu02
$hensu03
$hensu04
  …

今回は上記のような「変数を連番で取る方法」をご紹介します。

以下、スクリプトです。
For ( $i = 1 ; $i -lt 10 ; $i++)
{
# testで始まる連番の変数を作成する
Set-Variable -Name ("test0" + $i) -Value ($i)
}

# 作成したtestが付く変数を全て取得する
Get-Variable -Name test*
上記内容をコピーし、PowerShell ISEに貼り付け後、実行するとコンソール部分に作成した変数が表示されるはずです。

続いて解説をしていきます。

* * * * * 解説 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
For文の記述方法については説明不要だと思いますので割愛いたします。

# testで始まる連番の変数を作成する
Set-Variable -Name ("test0" + $i) -Value ($i)
ここで変数を作成しています。
変数を作成するにはSet-Variableコマンドレットを使用します。
Nameプロパティで変数名を指定し、Valueプロパティで変数内の値を指定します。

上記の例では、新しい変数名に$iという変数を指定しています。
$iはFor文で1から9までの値が格納されますので、結果、$test01~$test09の変数が作成されます。
これで連番の変数が作成できます。

# 作成したtestが付く変数を全て取得する
Get-Variable -Name test*
この文はいわばオマケですが、Set-Variableコマンドレットと対をなすのがこのGet-Variableコマンドレットです。
Get-Variableコマンドレットはその名のとおり、変数を取得するためのものです。
Nameプロパティで取得する変数名を指定するのですが、その際にワイルドカードを使用することができます。
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

解説は以上となります。

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================

PowerShellでPDFファイルを結合する

$
0
0
PDFファイルは様々な場面で登場します。
複数のPDFファイルを1つにまとめたいと思ったことがある方は非常に多いのではないでしょうか。

巷にはPDFファイルを操作するフリーソフトはたくさんありますが、わざわざダウンロードしなくてもPowerShell(とiTextSharp)があれば簡単な操作は可能です。

ここでは「PowerShellでPDFファイルを結合する方法」をご紹介します。

※事前に iTextSharp.dll を入手しておく必要がありますので、各自ダウンロードをお願いします。
以下、スクリプトです。
## PowerShellからiTextSharpを使用したPDFファイルの結合

# iTextSharpの読み込み
[System.Reflection.Assembly]::LoadFrom("D:\itextsharp.dll")

# pdfファイルの指定
$pdf1 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\user001\Desktop\001.pdf")
$pdf2 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\user001\Desktop\002.pdf")

# 新しいPDFファイル
$new_pdf = New-Object System.IO.FileStream("C:\Users\user001\Desktop\new_pdf.pdf", [System.IO.FileMode]::OpenOrCreate)

# 結合後ファイルに読み込んだpdfファイルのコピーを追加する
$copy = New-Object iTextSharp.text.pdf.PdfCopyFields($new_pdf)
$copy.AddDocument($pdf1)
$copy.AddDocument($pdf2)

# 後片付け
$copy.Close()
$new_pdf.Close()
$pdf1.Close()
$pdf2.Close()

続いて解説です。

- - - - - - - 解説 - - - - - - - -
# iTextSharpの読み込み
[System.Reflection.Assembly]::LoadFrom("D:\itextsharp.dll")
ここでは、ライブラリファイル「iTextSharp.dll」をインポートしています。
iTextSharp.dllを格納している場所は各自異なると思いますので、パスの部分は適宜変更してください。

# pdfファイルの指定
$pdf1 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\user001\Desktop\001.pdf")
$pdf2 = New-object iTextSharp.text.pdf.pdfreader("C:\Users\user001\Desktop\002.pdf")
続いて、既存のPFファイルを読み込み、それぞれを変数に格納しています。

# 新しいPDFファイル
$new_pdf = New-Object System.IO.FileStream("C:\Users\user001\Desktop\new_pdf.pdf", [System.IO.FileMode]::OpenOrCreate)
ここでは、入れ物となる新しいPDFファイルを生成しています。
この時点ではまだ空っぽです。

# 結合後ファイルに読み込んだpdfファイルのコピーを追加する
$copy = New-Object iTextSharp.text.pdf.PdfCopyFields($new_pdf)
$copy.AddDocument($pdf1)
$copy.AddDocument($pdf2)
次に、新しいPDFファイルを受け入れ状態にしたうえで、先に読み込んでおいた既存のPDFファイルを追加します。

# 後片付け
$copy.Close()
$new_pdf.Close()
$pdf1.Close()
$pdf2.Close()
最後に、これまで使用した各ファイルを閉じて終了です。
この閉じる操作を怠ると、PowerShellで開いたままの状態となってしまい、削除や移動などができない可能性がありますので忘れないようにしなければなりません。

以上で結合は完了です。
新しいPDFファイルを開き、結合されていることを確認してください。

Viewing all 30 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>