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

PowerShellでユーザーフォームを作る - NumericUpDownコントロール編 -

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

今回は「PowerShellでユーザーフォームを作る - NumericUpDownコントロール編 -」です。


タイトルを見て、「NumericUpDownコントロール??なにそれ?おいしいの??」と思ったそこのアナタ!!
ご意見はごもっともです。

NumericUpDownコントロールと言われても馴染みのない言葉だと思います。
しかし、これは見たことがあるのではないでしょうか。


<今回の完成品>


そうです!これがNumericUpDownコントロールです。
数字を増減させるときに使うアレですね!

私の業務上では使用する機会がありませんので、あまり細かい部分までは調べていませんが、せめて基本形だけでも紹介させていただきます。

---------ここから-------------------------------------------------------------------------------------
# ユーザーフォームを作る - NumericUpDownコントロール編 -

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

# フォーム全体の作成
$form = New-Object System.Windows.Forms.Form
$form.Size = "300,100"
$form.StartPosition = "CenterScreen"
$form.MaximizeBox = $false
$form.MinimizeBox = $false
$form.text = "NumericUpDownコントロール"

# NumericUpDownコントロールの作成
$Numeric = New-Object System.Windows.Forms.NumericUpDown
$Numeric.location = "30,20"
$Numeric.TextAlign = "Right"
$Numeric.UpDownAlign = "Right"
$Numeric.Maximum = "100"
$Numeric.Minimum = "80"
$Numeric.Text = "90"
$Numeric.InterceptArrowKeys = $True

# フォームにコントロールを追加
$form.Controls.Add($Numeric)

# フォームを表示
$form.ShowDialog()
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて、実行してみてください。
完成品と同じようなものが表示されるはずです。

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

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


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

# NumericUpDownコントロールの作成
$Numeric = New-Object System.Windows.Forms.NumericUpDown
$Numeric.location = "30,20"
$Numeric.TextAlign = "Right"
$Numeric.UpDownAlign = "Right"
$Numeric.Maximum = "100"
$Numeric.Minimum = "80"
$Numeric.Text = "90"
$Numeric.InterceptArrowKeys = $True

ここでは、WindowsフォームのNumericUpDownクラスをインスタンス化(実体化)しています。
いくつかのプロパティを設定していますので、簡単に説明します。

$Numeric.location = "30,20"
→ フォーム上でのNumericUpDownコントロールの位置を左から30、上から20の位置に設定

$Numeric.TextAlign = "right"
→ NumericUpDownコントロール内のテキストの表示位置を右寄せに設定。
  Right、Left、Centerから選択可。規定値はLeft。

$Numeric.UpDownAlign = "Right"
→  増減ボタンの位置を右側に設定。
  Right、Leftから選択可。規定値はRight。

$Numeric.Maximum = "100"
$Numeric.Minimum = "80"
→ 最大値を100に、最小値を80に設定

$Numeric.Text = "90"
→ 初期値を90に設定

$Numeric.InterceptArrowKeys = $True
→ キーボードの↑キーと↓キーでの増減操作を許可。
  規定値はTrue。

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

解説は以上となります。

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

PowerShellでユーザーフォームを作る - DatetimePickerコントロール編 -

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

今回は「PowerShellでユーザーフォームを作る - DatetimePickerコントロール編 -」です。

前回ご紹介したNumericUpDownコントロールは「数値」を増減させるものでしたが、今回ご紹介するのは「日付/時間」を増減させるものです。


<今回の完成品>


この中の展開ボタンを押すと次のように表示されます。


カレンダーが表示され、任意の日付を選択できるようになります。

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

---------ここから-------------------------------------------------------------------------------------
# ユーザーフォームを作る - DatetimePickerコントロール編 -

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

# フォーム全体の作成
$form = New-Object System.Windows.Forms.Form
$form.Size = "300,100"
$form.StartPosition = "CenterScreen"
$form.MaximizeBox = $false
$form.MinimizeBox = $false
$form.Text = "DateTimePickerコントロール"

# DatetimePickerコントロールの作成
$Date = New-Object System.Windows.Forms.DatetimePicker
$Date.location = "30,20"
$Date.Format = "Long"

# フォームにコントロールを追加
$form.Controls.Add($Date)

# フォームを表示
$form.ShowDialog()
---------ここまで-------------------------------------------------------------------------------------

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

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

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


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

# DatetimePickerコントロールの作成
$Date = New-Object System.Windows.Forms.DatetimePicker
$Date.location = "30,20"
$Date.Format = "Long"

ここではWindowsフォームのDatetimePickerクラスをインスタンス化(実体化)し、変数Dateに格納しています。
この中のFormatプロパティは表示形式を指定するもので、Long、Short、Time、Customから選択が可能です。(規定値はLong)

例えば、$Date.Format = "Time" とした場合は、時間のみを表示します。

また、前述に「展開ボタンを押すとカレンダーが表示される」と記述しましたが、この展開ボタン部分をアップダウンコントロールへ変更することが可能です。
  $Date.ShowUpDown = $True
この一文を$Date.Format = "Long"の次行に追加し、再度実行すると、次のように表示されます。



ボタン部分が変わっているのがわかるでしょうか。
アップダウンコントロールにすることで、それぞれの数値を任意に増減させることができます。

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

解説は以上となります。

例えば私は業務で、毎日Excelファイルを作成し、その日の日付をファイル名に組み込んで保存しています。

今回のDatetimePickerコントロールを使えば、GUIでユーザーに日付の選択を求めることができるので、パソコンが苦手な年配の方々にもわかりやすいものになるのではないかと考えています。

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

PowerShellでユーザーフォームを作る - スクロールバー編 -

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

今回は「PowerShellでユーザーフォームを作る - スクロールバー編 -」です。

 スクロールバーは、下限・上限で範囲の決まっている値を変化させる際によく用いられるものです。

<今回の完成品>


バーを動かすと、0~100の間で数値が増減します。




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

---------ここから-------------------------------------------------------------------------------------
# ユーザーフォームを作る - スクロールバー編 -


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

#フォームの設定
$form = New-Object System.Windows.Forms.Form
$form.Size = "250,200"
$form.startposition = "centerscreen"
$form.text = "スクロールバー"
$form.MaximizeBox = $False
$form.MinimizeBox = $False
$form.BackColor = "lightgreen"

#スクロールバー
$Bar = New-Object System.Windows.Forms.HScrollBar
$Bar.Location = "10,50"
$Bar.size = "200,30"
$Bar.maximum = "100"
$Bar.minimum = "0"
$Bar.largechange = "1"
$form.Controls.Add($Bar)

#ラベル
$Label = New-Object System.Windows.Forms.Label
$Label.location = "50,90"
$Label.text = $Bar.value
$Label.Controls.Add($Label)

#イベント
$Bar.Add_ValueChanged({$Label.text = $Bar.value})

# フォームを表示する
$Form.Showdialog()

---------ここまで-------------------------------------------------------------------------------------

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

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

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


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

#スクロールバー
$Bar = New-Object System.Windows.Forms.HScrollBar
$Bar.Location = "10,50"
$Bar.size = "200,30"
$Bar.maximum = "100"
$Bar.minimum = "0"
$Bar.largechange = "1"
$form.Controls.Add($Bar)


ここではHScrollBarクラスをインスタンス化し、変数Barに格納しています。
Maximumプロパティに最大値、Minimumプロパティには最小値を設定します。
さらにLargeChangeプロパティは「バーを大きく動かしたとき」(下図をクリックしたとき)にどれだけ値を変化させるのかを指定します。
今回は"1"にしていますが、例えば"10"とすれば、1クリックで10動きます。


#イベント
$Bar.Add_ValueChanged({$Label.text = $Bar.value})


ここでは、スクロールバーにValueChangedイベントを設定しています。
つまり、スクロールバーの値が変化すると、同時にラベルの値がスクロールバーの値に変化します。

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

解説は以上となります。

PowerShellでのイベント記述方法は、ネット上ではあまり情報がないようで、少し苦労しました・・・。
今後は様々なイベントについても少しずつ記述していきたいと思います。

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

[PowerShell] イベントの記述方法

$
0
0
これまで様々なフォームの作成方法をご紹介してきました。
しかし、さらに便利なフォームにしてくには、ボタン等へのイベントを組み込むことが必要です。

そこで今回は、イベントの中でも最もオーソドックな「クリックイベント」と「ダブルクリックイベント」の記述方法をご紹介いたします。

フォームの使用感はイベントによって大きく変わってきますので、ぜひ覚えていきましょう!

<今回の完成品>


上記のフォーム上にある「ボタンA」をクリックすると次のメッセージが表示され、


さらにラベル「この文字列をダブルクリック」部分をダブルクリックすると、次のメッセージが表示されます。


それでは、スクリプトを記述します。
---------ここから-------------------------------------------------------------------------------------
# イベントの記述方法

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

# フォーム
$form = New-Object System.Windows.Forms.Form
$form.Size = "250,200"
$form.startposition = "centerscreen"
$form.text = "イベント"
$form.MaximizeBox = $false
$form.MinimizeBox = $false

# ボタンA
$ButtonA = New-Object System.Windows.Forms.Button
$ButtonA.Location = "50,20"
$ButtonA.size = "80,30"
$ButtonA.text  = "ボタンA"
$ButtonA.FlatStyle = "popup"
$form.Controls.Add($ButtonA)

# ボタンAのクリックイベント
$ButtonA.Add_Click({[System.Windows.Forms.MessageBox]::Show("ボタンAが押されました", "結果")})

# ラベル
$Label = New-Object System.Windows.Forms.Label
$Label.Location = "20,80"
$Label.Text = "この文字列をダブルクリック"
$Label.BackColor = "lightgreen"
$Label.AutoSize = $True
$form.Controls.Add($Label)

# ラベルのダブルクリックイベント
$Label.Add_DoubleClick({[System.Windows.Forms.MessageBox]::Show("ダブルクリックされました", "結果")})

# フォームの表示
$form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

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

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

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


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

# ボタンAのクリックイベント
$ButtonA.Add_Click({[System.Windows.Forms.MessageBox]::Show("ボタンAが押されました", "結果")})


クリックイベントの基本形は次のように記述します。
  対象.Add_Click({ イベント内容 })

今回の例であれば、
  対象      → $ButtonA
  イベント内容 → [System.Windows.Forms.MessageBox]::Show("ボタンAが押されました", "結果")
となります。

今回はイベント内容が少ないのでいいのですが、内容が増えると1行では書ききれない場合があります。
そんな時はイベント内容を変数に格納してしまいましょう。
変数に格納する場合は次のように記述すればOKです。

$Event = {
[System.Windows.Forms.MessageBox]::Show("ボタンAが押されました", "結果")
}
$ButtonA.Add_Click($Event)

# ラベルのダブルクリックイベント
$Label.Add_DoubleClick({[System.Windows.Forms.MessageBox]::Show("ダブルクリックされました", "結果")})


ダブルクリックイベントは「Add_~~」の部分が変わっただけで、その他の記述方法はクリックイベントと同様です。

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

解説は以上となります。

イベントの種類は今回ご紹介したクリックイベント・ダブルクリックイベントの他にもたくさんあります。
例えば、、、
マウスポインタを上に重ねたときに発生 → マウスオーバーイベント
○○の値が変化したときに発生      → バリューチェンジイベント
などなどです。

イベントは各クラスによって使えるもの使えないものがありますので、MSDNを参照ください。
(例えばButtonクラスならココ)

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

[PowerShell] ツールチップを使用する

$
0
0
今回はPowerShellでツールチップを使用するときの記述方法をご紹介します。

「ツールチップ」とは"カーソル(主にマウスポインタ)と連動して使用される。ユーザがカーソルを何かの項目に合わせたとき、その項目に覆いかぶさるような形で小さな枠が出現し、その枠内には選択された項目に関する補足情報が表示される。"とWikipediaには書かれています。

要するに下の写真のようなものです。

<今回の完成品>


この写真の「タイトル 表示させる文字列」の部分がツールチップです。
(これが「ツールチップ」という名称だということは私も最近知りました。)

今回の完成品では、ボタンAにマウスカーソルを合わせる(乗せる)と、ツールチップが表示されるようになっています。

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

---------ここから-------------------------------------------------------------------------------------
# ツールチップとマウスオーバーイベント

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

# ツールチップ
$Tooltip = New-Object System.Windows.Forms.Tooltip
$Tooltip.ShowAlways = $True
$Tooltip.ToolTipIcon = "none"
$Tooltip.ToolTipTitle = "タイトル"
$Tooltip.UseFading = $False
$Tooltip.AutoPopDelay = 3000

# フォーム
$form = New-Object System.Windows.Forms.Form
$form.Size = "200,200"
$form.StartPosition = "centerscreen"
$form.Text = "タイトル"
$form.MaximizeBox = $false
$form.MinimizeBox = $False

# ボタンA
$ButtonA = New-Object System.Windows.Forms.Button
$ButtonA.Location = "50,50"
$ButtonA.Size = "80,30"
$ButtonA.Text  = "ボタンA"
$ButtonA.FlatStyle = "popup"
$form.Controls.Add($ButtonA)

# ボタンAのマウスオーバーイベント
$ButtonA.Add_MouseHOver({$Tooltip.SetToolTip($ButtonA,"表示させる文字列")})

# フォームの表示
$form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

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

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

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


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

# ツールチップ
$Tooltip = New-Object System.Windows.Forms.Tooltip
$Tooltip.ShowAlways = $True
$Tooltip.ToolTipIcon = "none"
$Tooltip.ToolTipTitle = "タイトル"
$Tooltip.UseFading = $False
$Tooltip.AutoPopDelay = 3000


ここではまず「ツールチップを使用する」宣言をすると同時に、各プロパティの値を設定しています。
この時点ではまだボタンAにツールチップがセットされていません。

ShowAlwaysプロパティ・・・フォームが非アクティブのときにもツールチップを表示させるかどうかを設定。
ToolTipIconプロパティ・・・ツールチップ内の左側に表示させるアイコンをError、Info、Warining、Noneから指定。
ToolTipTitleプロパティ・・・ツールチップ内の上側に表示させる文字列を指定。
UseFadingプロパティ・・・ フェード効果を使用して表示するか否かを指定。規定値はTrue。
AutoPopDelayプロパティ・・・マウスカーソル静止時、ツールチップを表示させる時間をミリ秒で指定。3000ミリ秒は3秒。


# ボタンAのマウスオーバーイベント
$ButtonA.Add_MouseHOver({$Tooltip.SetToolTip($ButtonA,"表示させる文字列")})


ここでは、別途作成したボタンAにマウスオーバーイベントを設定しています。
イベントとは「○○したときに××をする」といった動作を指定するものです。

マウスオーバーイベントの内容には、ツールチップで表示させる文字列を指定しています。
当然、クリックイベントの記事でもご紹介した通り、イベントの内容は変数に置き換えることも可能です。

$Event = {
$Tooltip.SetToolTip($ButtonA,"表示させる文字列")
}
$ButtonA.Add_MouseHOver($Event)

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

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

解説は以上となります。

ツールチップは、実際あってもなくても問題はありません。
しかし、フォーム作成者だけではなく様々な人がそのフォームを使用する場合は、適度にツールチップを使用することで補足説明の役割を果たし、そのフォームはさらに使いやすいものになります。

仕事でフォームを作成する場合は、要所要所で上手にツールチップを活用していきましょう。

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

PowerShellでストップウォッチを自作する

$
0
0
今回は、PowerShellから.NET FrameworkのStopWatchクラスとTimerクラスを使用して、オリジナルのストップウォッチを作成します。

<今回の完成品>


できるだけシンプルなものにしています。
開始ボタンを押すと測定が始まり、もう一度押すと測定を停止します。
測定を停止するとリセットボタンが押下可能となり、それを押すと経過時間をリセットします。

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

---------ここから-------------------------------------------------------------------------------------
# ストップウォッチ

# アセンブリの読み込み
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#ストップウォッチ
$Watch = New-Object System.Diagnostics.Stopwatch

#タイマー
$Timer = New-Object System.Windows.Forms.Timer
$Timer.Interval = 10
$Time = {
    $Now = $Watch.Elapsed
    $Label.Text = "$Now".substring(0,11)
}
$Timer.Add_Tick($Time)

# フォームの作成
$Time_Form = New-Object System.Windows.Forms.Form
$Time_Form.Size = "190,170"
$Time_Form.font = New-Object System.Drawing.Font("メイリオ",9)
$Time_Form.StartPosition = "CenterScreen"
$Time_Form.MinimizeBox = $False
$Time_Form.MaximizeBox = $False
$Time_Form.TopLevel = $True
$Time_Form.Text = "ストップウォッチ"

# 時間表示ラベル
$Label = New-Object System.Windows.Forms.Label
$Label.Location = "10,10"
$Label.Size = "150,50"
$Label.text = "00:00:00.00"
$Label.Font = New-Object System.Drawing.Font("メイリオ",16)
$Label.textAlign = "MiddleCenter"

# 開始・停止兼用ボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "10,70"
$Button.Size = "70,50"
$Button.Text = "開 始"
$Click = {
    IF ( $Watch.IsRunning -eq $False ) #ストップウォッチが起動していない時 = 計測を開始
    {
        $Timer.Start()
        $Watch.Start()
        $Button.Text = "停 止"
    }else{ #ストップウォッチが起動している時 = 計測を停止
        $Timer.Stop()
        $Watch.Stop()
        $ResetButton.Enabled = $true
        $Button.Text = "再 開"
    }
}
$Button.Add_Click($Click)

# リセットボタン
$ResetButton = New-Object System.Windows.Forms.Button
$ResetButton.Location = "90,70"
$ResetButton.Size = "70,50"
$ResetButton.Text = "リセット"
$ResetButton.Enabled = $False
$Reset = {
    $Label.text = "00:00:00.00"
    $Watch.Reset()
    $Button.Text = "開 始"
    $ResetButton.Enabled = $False
}
$ResetButton.Add_Click($Reset)

# フォームに各アイテムを設置 
$Time_Form.Controls.AddRange(@($Label,$Button,$ResetButton))

# フォームを表示
$Time_Form.ShowDialog()
---------ここまで-------------------------------------------------------------------------------------

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

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

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


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

#ストップウォッチ
$Watch = New-Object System.Diagnostics.Stopwatch

ここではまずStopWatchクラスを使用する宣言を行っています。
(この時点ではまだ測定を開始していません)

測定を開始する場合はStartメソッド、測定を停止する場合はStopメソッド、経過時間をリセットする場合はResetメソッドを使用します。
今回の例では、Startメソッド・Stopメソッドを「開始・停止兼用ボタン」のクリックイベントに、Resetメソッドは「リセット」ボタンのクリックイベントにそれぞれ仕込んでいます。
StopWatchクラスのプロパティには、経過時間の合計を返すElapsedプロパティや、実行中か否かを返すIsRunningプロパティなどがあります。


#タイマー
$Timer = New-Object System.Windows.Forms.Timer
$Timer.Interval = 10
$Time = {
    $Now = $Watch.Elapsed
    $Label.Text = "$Now".substring(0,11)
}
$Timer.Add_Tick($Time)

ここでは、Timerクラスを使用する宣言を行っています。
Timerクラスは「一定時間内に繰り返し処理を発生させる」場合に使用するものです。
今回の使い方としては、一定時間内(今回は0.01秒毎)にStopWatchクラスの経過時間を取得し、ラベルのテキストに落としこむようになっています。

TimerクラスのIntervalプロパティはTickイベントを発生させる間隔をミリ秒で指定します。(1秒は1000ミリ秒)

なお今回は、取得した経過時間の先頭から11文字をラベルのテキストに指定しています。
つまり「00:00:00.00」の状態です。
取得した経過時間をそのままラベルのテキストとした場合は、「00:00:00.0000000」となります。


各ボタンのクリックイベントについは、解説を省略させていただきます。
イベントの記述方法についてはこちらをご覧ください。

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

Timerクラスは、上記の通り「一定時間に処理を繰り返す」ことができます。
これを使うと例えば、1秒毎に画像を切り替えたり、作業開始から1時間経過したらメッセージを表示するなど、アイデア次第で様々なことに使えると思いますので、ぜひ 遊んで 勉強してみてください。

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

[PowerShell] フォームにメニューバーを付ける

$
0
0
PowerShellで作成したフォームにメニューバーを付ける方法をご紹介します。

メニューバーは大多数のソフトウェアで使用されています。
メモ帳でも、フォルダでも、Google Chromeでも、Excelでもです。

メニューバーを付けることによって、フォーム内に入りきれない情報や機能を盛り込むことができるようになります。

自分で作ったフォームにもメニューバーを設置して、さらに使い勝手を良くしていきましょう!!


<今回の完成品>


画像の中で「項目1」「項目2」となっている部分がメニューバーです。
それぞれの項目内には、さらに小分類を設置することができます。

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

---------ここから-------------------------------------------------------------------------------------
# メニューバー

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

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

# メニューバー
$Menu = New-Object System.Windows.Forms.MenuStrip

# 項目1
$Item1 = New-Object System.Windows.Forms.ToolStripMenuItem
$Item1.Text = "項目1"

    # 項目1 - 子項目1      
    $SubMenu1 = New-Object System.Windows.Forms.ToolStripMenuItem
    $SubMenu1.Text = "メッセージ その1 を表示"
    $SubMenu1.ShortcutKeys = [System.Windows.Forms.Keys]::Control, [System.Windows.Forms.Keys]::L # ショートカットキーCtrl+L
    $Click01 = {
        [System.Windows.Forms.MessageBox]::Show("メッセージその1が選択されました", "成功")
    }
    $SubMenu1.Add_Click($Click01)

    # 子項目1の下にセパレーター(区切り線)を入れる
    $Sepa = New-Object System.Windows.Forms.ToolStripSeparator

    # 項目1 - 子項目2
    $SubMenu2 = New-Object System.Windows.Forms.ToolStripMenuItem
    $SubMenu2.Text = "閉じる"
    $SubMenu2.ShortcutKeys = [System.Windows.Forms.Keys]::Control, [System.Windows.Forms.Keys]::F12 # ショートカットキーCtrl+F12
    $Click02 = {
        $form.Close()
    }
    $SubMenu2.Add_Click($Click02)

    # 項目1に子項目を全て入れる
    $Item1.DropDownItems.AddRange(@($SubMenu1,$Sepa,$SubMenu2))

# 項目2
$Item2 = New-Object System.Windows.Forms.ToolStripMenuItem
$Item2.Text = "項目2"

    # 項目2 - 子項目1      
    $SubMenu3 = New-Object System.Windows.Forms.ToolStripMenuItem
    $SubMenu3.Text = "メッセージ その2 を表示"
    $SubMenu3.ShortcutKeys = [System.Windows.Forms.Keys]::Control, [System.Windows.Forms.Keys]::G # ショートカットキーCtrl+G
    $Click03 = {
        [System.Windows.Forms.MessageBox]::Show("メッセージその2が選択されました", "成功")
    }
    $SubMenu3.Add_Click($Click03)

    # 項目2 - 子項目2
    $SubMenu4 = New-Object System.Windows.Forms.ToolStripMenuItem
    $SubMenu4.Text = "メッセージ その3 を表示"
    $SubMenu4.ShortcutKeys = [System.Windows.Forms.Keys]::Control, [System.Windows.Forms.Keys]::T # ショートカットキーCtrl+T
    $Click04 = {
        [System.Windows.Forms.MessageBox]::Show("メッセージその3が選択されました", "成功")
    }
    $SubMenu4.Add_Click($Click04)

    # 項目2に子項目を全て入れる
    $Item2.DropDownItems.AddRange(@($SubMenu3,$SubMenu4))

# メニューバーに項目1・項目2を入れる
$Menu.Items.AddRange(@($Item1,$Item2))

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

$form.Controls.AddRange(@($Menu,$Button))

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

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


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


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


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

# メニューバー
$Menu = New-Object System.Windows.Forms.MenuStrip

ここではメニューバーを使用するための宣言を行っています。
この段階ではまだ空の状態であり、フォーム上にも設置されていません。


# 項目1
$Item1 = New-Object System.Windows.Forms.ToolStripMenuItem
$Item1.Text = "項目1"

次に、メニューバーの中にいれるアイテム(項目)を作成しています。
Textプロパティに指定した文字列がメニューバー上に表示されることになります。
よく見かけるのは「ファイル」「編集」「表示」などですね。


# 項目1 - 子項目1      
$SubMenu1 = New-Object System.Windows.Forms.ToolStripMenuItem
$SubMenu1.Text = "メッセージ その1 を表示"
$SubMenu1.ShortcutKeys = [System.Windows.Forms.Keys]::Control, [System.Windows.Forms.Keys]::L # ショートカットキーCtrl+L
$Click01 = {
[System.Windows.Forms.MessageBox]::Show("メッセージその1が選択されました", "成功")
}
$SubMenu1.Add_Click($Click01)

ここでは、先ほど作成した項目1の中に入れる項目(子項目と呼ぶことにします)を作成しています。
子項目1の機能としては、「選択されるとメッセージボックスを表示させる」というものです。
また便利な機能として、ショートカットキーを設定しています。
ShortcutKeysプロパティを設定することで、任意のキーを指定することができます。
なお、ShortcutKeysプロパティにキーを設定すると、自動的に子項目1の文字列の右側にそのキーが表示されるようになります。


# 子項目1の下にセパレーター(区切り線)を入れる
$Sepa = New-Object System.Windows.Forms.ToolStripSeparator

ここでは、子項目1と子項目2の間に、セパレーター(区切り線)を挿入しています。
これはあってもなくても問題ありません。


# 項目1に子項目を全て入れる
$Item1.DropDownItems.AddRange(@($SubMenu1,$Sepa,$SubMenu2))

項目1の最後には、項目1の中に設置する子項目を入れるよう記述します。


# メニューバーに項目1・項目2を入れる
$Menu.Items.AddRange(@($Item1,$Item2))

更に、作成した項目をメニューバーの中に入れるよう記述します。


$form.Controls.AddRange(@($Menu,$Button))

そして最後に、フォームにメニューバーを入れるよう記述します。

つまり順番としては、
子項目を項目に入れる
  ↓
項目をメニューバーに入れる
  ↓
メニューバーをフォームに入れる という流れになります。

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

メニューバーを設置し、内容を充実させることによって、そのフォームはますます機能が増え、使い勝手が向上します。

どんな機能を持たせるかは、作成者次第ですので、いろいろな使い方を検討してみてください。

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

[PowerShell] 右クリックイベントを設定する

$
0
0
今回は、PowerShellで独自にフォームを作成した際、右クリックイベントを設定する方法(記述方法)についてご紹介したいと思います。

クリックイベントやダブルクリックイベントの記述方法は下記リンク先の記事をご覧ください。

  参照 → [PowerShell] イベントの記述方法



早速スクリプトを記述します。
なお、今回は該当部分のみを詳細に記述し、フォーム部分やボタン部分の記述は省略していますのでご注意ください。

---------ここから-------------------------------------------------------------------------------------
# 右クリックイベントの記述方法

$RightClick = {
 IF( $_.Button -eq "Right" )
    {
          [System.Windows.Forms.MessageBox]::Show("右クリックされました!", "結果")
     }
}
$Button.Add_MouseDown($RightClick)

---------ここまで-------------------------------------------------------------------------------------

それでは解説していきます。

右クリックイベントを設定するには「MouseDown」イベントを使用します。

MouseDownイベントは「マウスのボタンのどれかが押された時」に発生します。

上記スクリプトでは、押されたボタンが"Right"の時のみメッセージが表示されます。

IF文内での「$_.Button」についてですが、これはMouseEventArgsクラスのButtonプロパティを表しており、押されたマウスボタンを返します。
"Right"以外にも、"Left"、"Middle"、"None"、"XButton1"、"XButton2"があります。

例えば、"Middle"はマウスの中央ボタンを表し、(通常は)マウスホイールを押した("回す"のではなく、あくまで"押す")ことを表します。

クリックイベント・ダブルクリックイベントだけでは足りない場合に活用いただけると思います。

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

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

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

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

リストビューは、以前ご紹介したリストボックスとは異なり、表示方法を指定できること、詳細表示を指定すれば、サブ項目まで表示させることができます。

今回のリストビューでは、詳細表示を取り上げていきますので、予めご了承ください。

<今回の完成品>


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

---------ここから-------------------------------------------------------------------------------------
# ListView テスト
# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms

#フォーム
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "340,250"
$Form.StartPosition = "CenterScreen"
$Form.Text = "メンバー一覧"

# リストビューの設置
$View = New-Object System.Windows.Forms.ListView
$View.Location = "10,10"
$View.Size = "300,150"
$View.View = "Details"
$View.GridLines = $True

# リストビューにヘッダーを追加
[void]$View.Columns.Add("名前",100)
[void]$View.Columns.Add("性別",100)
[void]$View.Columns.Add("年齢",95)

# 項目を追加
$Item = New-Object System.Windows.Forms.ListViewItem("山田 太郎")
[void]$Item.SubItems.Add("男")
[void]$Item.SubItems.Add("20")
[void]$View.Items.Add($Item)

$Item2 = New-Object System.Windows.Forms.ListViewItem("田中 花子")
[void]$Item2.SubItems.Add("女")
[void]$Item2.SubItems.Add("15")
[void]$View.Items.Add($Item2)

$Item3 = New-Object System.Windows.Forms.ListViewItem("鈴木 三郎")
[void]$Item3.SubItems.Add("男")
[void]$Item3.SubItems.Add("25")
[void]$View.Items.Add($Item3)

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

$Form.Controls.AddRange(@($View,$Button))

$Form.Showdialog()

---------ここまで-------------------------------------------------------------------------------------

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

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

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

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

# リストビューの設置
$View = New-Object System.Windows.Forms.ListView
$View.Location = "10,10"
$View.Size = "300,150"
$View.View = "Details"
$View.GridLines = $True

ここでは、ListViewクラスをインスタンス化し、変数Viewに格納しています。
Locationプロパティで位置を、Sizeプロパティでリストビューの大きさを指定しています。
Viewプロパティには詳細表示を意味する"Details"を指定しています。
また、Viewプロパティが"Details"の場合のみ使用できるGridLineプロパティを有効にし、行と列の間にグリッド線を入れています。

ではここで、ListViewクラスで覚えておくと便利だなと筆者が思うプロパティをご紹介します。

●Viewプロパティ
 表示方法を指定します。
 選択肢は"Details"、"LargeIcon"、"SmallIcon"、"List"、"Tile"です。
 規定値は"LargeIcon"です。

●CheckBoxesプロパティ
 各項目の横にチェックボックスを付けるかどうかを指定します。
 規定値はFalseです

●CheckedItemsプロパティ
 チェックボックスが有効になっている状態で、チェックが付いている項目を取得します。
 今回の例でいうと、次の画像のようにチェックが入っている場合・・・
  $View.CheckedItems[0].Text ⇒ 「田中 花子」
  $View.CheckedItems[1].Text ⇒ 「鈴木 三郎」
  $View.CheckedItems[0].SubItems[2].Text ⇒ 「15」
  $View.CheckedItems[1].SubItems[1].Text ⇒ 「男」


●FullRowSelectプロパティ
 項目を選択した時、そのサブ項目も選択状態にするかどうかを指定します。
 規定値はFalseです。

●HeaderStyleプロパティ
 列ヘッダーのスタイルを指定します。
 選択肢は"Clickabel"、"NonClickable"、"None"です。
 規定値は"Clickabel"です。

●HoverSelectionプロパティ
 マウスポインターが項目上に1秒程留まった時、その項目を選択状態にするかどうかを指定します。
 規定値はFalseです。

●Itemsプロパティ
 ListView内の全ての項目を取得します。
 今回の例でいうと、次のように記述すれば、それぞれを個別に取得することができます。
  $View.Items[0].Subitems[2].Text ⇒ 「20」
  $View.Items[1].Subitems[0].Text ⇒ 「田中 花子」
  $View.Items[2].Subitems[1].Text ⇒ 「男」
  $View.Items[1].Index ⇒ 「1」

●MultiSelectプロパティ
 複数の項目を同時に選択できるようにするかどうかを指定します。
 規定値はTrueです。
 同時に選択するには、CtrlキーもしくはShiftキーを押しながらクリックします。

●Scrollableプロパティ
 ListViewの幅に対し、ヘッダー幅合計の方が大きい場合、自動的にスクロールバーを付加するかどうかを指定します。
 規定値はTrue(付加する)です。

●SelectedItemsプロパティ
 選択されている項目を取得します。
 今回の例でいうと、次の画像のように選択された場合、下記のように記述することで、目的のものだけを取得することができます。
  $View.SelectedItems[0].SubItems[1].Text ⇒ 「男」
  $View.SelectedItems[1].SubItems[0].Text ⇒ 「田中 花子」



# リストビューにヘッダーを追加
[void]$View.Columns.Add("名前",100)
[void]$View.Columns.Add("性別",100)
[void]$View.Columns.Add("年齢",95)

ここでは、リストビューに列ヘッダーを追加しています。
第1引数は列タイトルを、第2引数は列幅を指定しています。
文頭に[void]を記述しているのは、コンソールへの出力を防ぐためです。


# 項目を追加
$Item = New-Object System.Windows.Forms.ListViewItem("山田 太郎")
[void]$Item.SubItems.Add("男")
[void]$Item.SubItems.Add("20")
[void]$View.Items.Add($Item)

ここでは、リストビューに項目を追加しています。
項目名「山田 太郎」を引数に持たせた状態でListViewItemをインスタンス化し、さらにサブ項目を追加して、リストビューに追加します。

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

解説は以上となります。

個人的には、リストボックスよりもリストビューの方が、表のようになっていて見やすいので、便利だなと思っています。

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

PowerShellで詳細プロパティの値を取得する

$
0
0
あるファイルを右クリックしプロパティを表示させると、そのファイルの情報(サイズや作成日時、更新日時など)を確認することができます。

Get-ChildItemコマンドレットを使用すれば、そのプロパティ情報を取得することができます。

<サンプルスクリプト>

$Sample = Get-ChildItem -Path "C:\PowerShell\サンプル.xlsx"

#ファイルサイズ
$Sample.Length

#更新日時
$Sample.LastWriteTime


上記以外にも、「$Sample.DirectoryName」でそのファイルが格納されているフォルダのパス、「$Sample.LastAccessTime」でアクセス日時を取得することができます。
その他については、「$Sample.」のタブ補完でご確認ください。


今回の本題はここからです。

ファイルのプロパティには、他にも様々な項目が存在します。
(右クリック→プロパティ→詳細タブを参照ください)

JPGファイル・MPGファイル・Excelファイルを確認しましたが、その全てに撮影日時・作成者・アルバム名・タイトル・件名・カメラのモデルなどなど287個の項目が確認できました。

この項目は、その値の有無に関らず必ず存在しているようです。
例えば、Excelデータにも「撮影日時」の項目は存在しますが、値は空となっています。
(右クリックしても表示されませんが、コマンドを使用すれば取得することができます)

それでは早速、詳細なプロパティの値を取得するスクリプトを記述します。

---------ここから-------------------------------------------------------------------------------------
# 詳細プロパティの取得

# シェルオブジェクトを作成
$Shell = New-Object -ComObject Shell.Application

# フォルダの指定
$Folder = $Shell.NameSpace("C:\PowerShell")

# ファイルの指定
$File = $Folder.parseName("P001.JPG")

# 詳細プロパティ(撮影日時)の取得
$GET = $Folder.GetDetailsOf($File,12)

Write-Host $GET

---------ここまで-------------------------------------------------------------------------------------


上記スクリプトは、Cドライブ内の「PowerShell」フォルダの中にある「P001」というJPGファイル(写真データ)の撮影日時を取得しています。


# 詳細プロパティ(撮影日時)の取得
$GET = $Folder.GetDetailsOf($File,12)

この記述で撮影日時を取得しています。

プロパティの項目は287個あり、その全てに固有の番号が設定されています。

例えば、0=名前、1=サイズ、2=項目の種類、3=更新日時、4=作成日時、5=アクセス日時・・・286=総ビットレート という具合です。

上記例では、撮影日時を表す"12"を指定しています。

これとFor文と組み合わせることによって、「撮影日時が○○年○○月○○日のデータだけを抽出する」なんてことが可能になります。

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

PowerShellでビープ音を鳴らす

$
0
0
完成されたソフトウェアを使用しているときに、エラーの場合や、クリックできない部分をクリックした場合等に「ピッ」とか「プッ」と音が鳴る時があります。

この音のことを「ビープ音」とか「警告音」とか言うそうです。

今回はこのビープ音をPowerShellから鳴らして、ドレミを奏でてみます。

早速スクリプトを記述します。

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

 [Console]::Beep(262, 500) #ド
 [Console]::Beep(294, 500) #レ
 [Console]::Beep(330, 500) #ミ
 [Console]::Beep(349, 500) #ファ
 [Console]::Beep(392, 500) #ソ
 [Console]::Beep(440, 500) #ラ
 [Console]::Beep(494, 500) #シ
 [Console]::Beep(523, 999) #ド

---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて、実行してみてください。
※音量に十分注意して実行してください!!

私は音符と仲良くありませんので、詳しい解説はできませんが、要するに音階を指定しているようです。

この音階を調整することで、こんなこともできる模様です。(拾い物)

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

[Console]::Beep(440,100)
[Console]::Beep(494,100)
[Console]::Beep(554,300)
[Console]::Beep(494,100)
[Console]::Beep(440,100)
Start-Sleep -milliseconds 100
[Console]::Beep(440,100)
[Console]::Beep(494,100)
[Console]::Beep(554,100)
[Console]::Beep(494,100)
[Console]::Beep(440,100)
[Console]::Beep(494,600)

---------ここまで-------------------------------------------------------------------------------------

実際、ピープ音はなくてもまったく困りません。

今回の内容は、「こんなこともできるんだなぁ」程度に覚えておくと、いずれ役に立つかもしれません。

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

[PowerShell] KeyDownイベントを設定する

$
0
0
今回は、キーボードで何らかのキーを押したときに発生するKeyDownイベントの記述方法をご紹介致します。

マウスを押したときに発生するイベントについては、過去記事をご覧ください。
   参照 → http://letspowershell.blogspot.jp/2015/09/powershell_21.html


早速スクリプトを記述致します。

なお、今回はフォーム上にあるテキストボックス$Textboxに、KeyDownイベントを設定するという想定で、KeyDownイベント部分のみを記述し、その他の部分は省略していますのでご注意ください。

---------ここから-------------------------------------------------------------------------------------
# KeyDownイベントの記述方法

$Event = {
  $PushKey = $_.KeyCode
  [System.Windows.Forms.MessageBox]::Show("押されたキーは:${PushKey}です", "結果")
}
$Textbox.Add_KeyDown($Event)

---------ここまで-------------------------------------------------------------------------------------

それでは解説していきます。

例えばフォーム上にテキストボックスがあり、入力待ちの状態であるとします。

この時、このテキストボックスが「コントロール」であり、入力待ちの状態が「フォーカスがある」ということです。
上記スクリプトでは、テキストボックスにフォーカスがある状態で、何らかのキーが押されると、押されたキーのキーコードをメッセージボックスで表示します。

イベント内の「$_.KeyCode」はKeyEventArgsのKeyCodeプロパティを表しており、各キーに定められたメンバー名を返します。

例えばEnterキーは「Return」、BackSpaceキーは「Back」が返ります。
それぞれのメンバー名はhttps://msdn.microsoft.com/ja-jp/library/system.windows.forms.keys(v=vs.110).aspxを参照ください。
例えば、Enterキーを押すと次のメッセージが表示されます。


また、Deleteキーを押すと、次のメッセージが表示されます。


これを用いれば、特定のキーを押した場合のみに処理を行うことも可能です。

上記スクリプトを、「Enterキーを押した場合のみ、メッセージボックスを表示」させるよう改変すると次のようになります。

---------ここから-------------------------------------------------------------------------------------
# KeyDownイベントの記述方法
$Event = {
  $PushKey = $_.KeyCode
  IF ( $PushKey -eq "Return" )
  {
   [System.Windows.Forms.MessageBox]::Show("押されたキーは:${PushKey}です", "結果")
  }
}
$Textbox.Add_KeyDown($Event)
---------ここまで-------------------------------------------------------------------------------------

KeyCodeを用いれば、IF~else文やSwitch文と組み合わせることによって、押したキーによって処理内容を変えることも可能となります。

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

PowerShellでユーザーフォームを作る - タブコントロール編

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

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

タブをググると次の検索結果が出てきました。

「タブ」とは、コンピュータのディスプレイ上に表示されている1つのウィンドウの中で、複数の画面を切り替えて使用する際の。それぞれの見出しのことです。」

1つのフォーム内に複数の機能を付けたいときにこのタブを使用すると見栄えがよくなり、使い勝手が向上します。

<今回の完成品>


「タブ1を選択した場合」の画像と「タブ2を選択した場合」の画像を表示しています。

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

---------ここから-------------------------------------------------------------------------------------
# タブコントロール

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

# フォーム
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "220,240"
$Form.startposition = "CenterScreen"
$Form.text = "タブ"

# タブコントロール
$TabControl = New-Object System.Windows.Forms.TabControl
$TabControl.size  = "200,200"

# タブページ1
$Tab1 = New-Object System.Windows.Forms.TabPage
$Tab1.Text = "タブ1"
$Tab1.BackColor = "powderblue"

# タブページ1の中のラベル
$Tab1Label = New-Object System.Windows.Forms.Label
$Tab1Label.location = "10,10"
$Tab1Label.text = "タブ1のラベル"
$Tab1.Controls.AddRange(@($Tab1Label))

# タブページ2
$Tab2 = New-Object System.Windows.Forms.TabPage
$Tab2.Text = "タブ2"

# タブページ2の中のボタン
$Tab2Button = New-Object System.Windows.Forms.Button
$Tab2Button.Location = "50,80"
$Tab2Button.size = "80,30"
$Tab2Button.text  = "閉じる"
$Tab2Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$Tab2.Controls.AddRange(@($Tab2Button))

# タブコントロールに各タブページを入れる
$TabControl.Controls.AddRange(@($Tab1,$Tab2))

# フォームにタブコントロールを入れる
$Form.Controls.Add($TabControl)

# フォームを表示
$Form.Showdialog()
---------ここまで-------------------------------------------------------------------------------------

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

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

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

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

フォームにタブを設置するには、ざっくり次のような手順が必要となります。

  1.フォームを作る
  2.タブコントロールを作る
  3.タブページを作る
  4.ウィジット(ボタンやラベル等)を作る
  5.ウィジットをタブページに入れる
  6.タブページをタブコントロールに入れる
  7.タブコントロールをフォームに入れる

特に5~7については記述する順番を間違えないようご注意ください。
表示されない可能性があります。


# タブコントロール
$TabControl = New-Object System.Windows.Forms.TabControl
$TabControl.size  = "200,200"

ここでは、タブコントロールをインスタンス化し、かつそのサイズを指定しています。(上記2に相当)

●タブの表示位置を変更するにはAlignmentプロパティをTop、Bottom、Left、Rightから指定します。(デフォルトはTop)

●タブの複数行表示を許可するにはMultilineプロパティを$Trueに設定します。

●タブの外観を変更するにはAppearanceプロパティをButtons、FlatButtons、Normalから指定します。(デフォルトはNormal)


# タブページ1
$Tab1 = New-Object System.Windows.Forms.TabPage
$Tab1.Text = "タブ1"
$Tab1.BackColor = "powderblue"

ここではタブページをインスタンス化しています。
Textプロパティはタブ部分に表示するテキストを指定し、BackColorプロパティはそのタブページ全体の背景色を指定しています。


# タブコントロールに各タブページを入れる
$TabControl.Controls.AddRange(@($Tab1,$Tab2))

作成したタブページをタブコントロールに入れる場合は上記のように記述します。
次のように記述しても同じです。
$TabControl.Controls.Add($Tab1)
$TabControl.Controls.Add($Tab2)


# フォームにタブコントロールを入れる
$Form.Controls.Add($TabControl)

フォームにタブコントロールを入れる場合は上記のように記述します。

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

解説は以上となります。
※各ウィジット(ラベル・ボタン)については省略させていただきました。

タブを使用する利点としては、外観をスッキリできることです。
1つのウィンドウ内に、全ての情報を詰め込むと見た目も悪くなり、作業効率も落ちてしまいます。
そこで例えば、「設定」というタブを設置し、そこに変更頻度の低い情報(例えばフォルダのパス等)をまとめておけば、メインタブの内容はかなりシンプルにすることができます。

過去に作成したフォームを見直し、「ごちゃごちゃしてるなー」と感じた場合は、タブの使用を検討してみてはいかがでしょうか。

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

[PowerShell] スクリプトファイルの実行方法について

$
0
0
今回は「コンソール画面を出さずにスクリプトファイルを実行する方法」をご紹介します。

その方法とは、バッチファイルを下記のように記述するだけです。

------ここから-----------------------------------------------------------------------------
powershell -WindowStyleHidden -command "C:\Powershell\hoge.ps1"
------ここまで-----------------------------------------------------------------------------

上記一文をテキストファイルに貼り付け、拡張子をbatで保存すればできあがりです。

作成したバッチファイルをダブルクリックすれば、一瞬だけコンソール画面が表示されますが、すぐ非表示になり、スクリプトファイルが実行されます。

このWindowsStyleは次の4つから選択することができます。
  ・Normal (通常)
  ・Minimized (最小化)
  ・Maximized (最大化)
  ・Hidden (非表示)

今回はスクリプトファイルのパスをフルパスで記述していますが、バッチファイルとスクリプトファイルが同階層(同じフォルダ)にある場合は、次のようにパスを省略することができます。

powershell -WindowStyle Hidden -command ".\hoge.ps1"


更に、次のように記述すれば実行ポリシーも同時に設定しつつスクリプトファイルを実行可能です。

powershell -WindowStyle Hidden -ExecutionPolicyBypass -command ".\hoge.ps1"

(みなさんは既に「Remote Signed」や「Bypass」に変更されているかと思います。)

例えば、独自に作成したスクリプトを社内で使用する場合など、スクリプトファイルとバッチファイルを一緒に配布し、「バッチファイルをダブルクリックするだけ」にしておけば、対象のパソコン全てを設定して回ったり、余計な説明を省くことができます。

ご存知でなかった方は、ぜひご活用ください。

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

PowerShellでユーザーフォームを作る - コンテキストメニュー編 -

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

今回は「PowerShellでユーザーフォームを作る - コンテキストメニュー編 -」です。

コンテキストメニューとは、ショートカットメニューとも呼ばれており、フォーム上のアイテム(ボタンなど)をクリックしたときなどにポップアップ表示されるメニューのことを言います。


<今回の完成品>


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

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

#コンテキストメニュー

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Size = "200,200"
$form.Startposition = "centerscreen"
$form.Text = "タイトル"

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,80"
$Button.Size = "80,30"
$Button.Text  = "閉じる"
$Button.FlatStyle = "Popup"
$Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.Controls.Add($Button)

# インスタンス化
$Context = New-Object System.Windows.Forms.ContextMenuStrip

# 項目を追加
[void]$Context.Items.Add("テスト1")
[void]$Context.Items.Add("テスト2")
[void]$Context.Items.Add("テスト3")

$Click = {
    # クリックされた項目を文字列として取得
    [String]$A = $_.ClickedItem

    # コンテキストメニューを閉じる
    $Context.Close()

    # クリックされた項目によって、表示メッセージを変える
    IF ( $A -eq "テスト1")
    {
        [System.Windows.Forms.MessageBox]::Show("テスト1が選択されました", "タイトル")
    }elseif( $A -eq "テスト2" ){
        [System.Windows.Forms.MessageBox]::Show("テスト2を選択しましたね?", "タイトル")
    }else{
        [System.Windows.Forms.MessageBox]::Show("テスト3を選択するとはお目が高い!", "タイトル")
    }
}
$Context.Add_ItemClicked($Click)

# クリックイベントの内容
$RIght = {
    IF ( $_.Button -eq "Right" )
    {
        $Context.Show()
    }
}
$form.Add_MouseDown($RIght)

# フォームにコンテキストメニューを追加
$form.ContextMenuStrip = $Context

$form.Showdialog()

---------ここまで-------------------------------------------------------------------------------------

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

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

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

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

# インスタンス化
$Context = New-Object System.Windows.Forms.ContextMenuStrip

ここでは、ContextMenuStripクラスをインスタンス化しています。


# 項目を追加
[void]$Context.Items.Add("テスト1")
[void]$Context.Items.Add("テスト2")
[void]$Context.Items.Add("テスト3")

続いて、メニューとして表示させる項目を追加します。
文頭に[void]を付けているのは、コンソールへの出力を防ぐためです。


$Click = {
    # クリックされた項目を文字列として取得
    [String]$A = $_.ClickedItem

    # コンテキストメニューを閉じる
    $Context.Close()

    # クリックされた項目によって、表示メッセージを変える
    IF ( $A -eq "テスト1")
    {
        [System.Windows.Forms.MessageBox]::Show("テスト1が選択されました", "タイトル")
    }elseif( $A -eq "テスト2" ){
        [System.Windows.Forms.MessageBox]::Show("テスト2を選択しましたね?", "タイトル")
    }else{
        [System.Windows.Forms.MessageBox]::Show("テスト3を選択するとはお目が高い!", "タイトル")
    }
}
$Context.Add_ItemClicked($Click)

ここでは、コンテキストメニューにアイテムクリックイベントを設定しています。

# クリックされた項目を文字列として取得
    [String]$A = $_.ClickedItem

この記述内の「$_」はToolStripItemClickedEventArgs クラスを表しており、そのClickedItemプロパティを取得し、変数Aに文字列として格納しています。
とどのつまり、クリックした項目が「テスト1」ならば、変数Aには「テスト1」が格納されます。

その後、if文を用いて変数Aの値によって、処理を分岐させ、メッセージを表示します。


# クリックイベントの内容
$RIght = {
    IF ( $_.Button -eq "Right" )
    {
        $Context.Show()
    }
}
$form.Add_MouseDown($RIght)

次に、フォームにマウスダウンイベントを設定し、右クリックの場合のみコンテキストメニューを表示するようにしています。


# フォームにコンテキストメニューを追加
$form.ContextMenuStrip = $Context

ここでは作成したコンテキストメニューをフォームを関連付けしています。
この記述がないと、コンテキストメニューは画面座標(0,0)の位置に表示されてしまうので注意が必要です。

コンテキストメニューを充実させることで、そのフォームの利便性はグッと向上します。

独自の項目・機能を盛り込み、より良いアプリケーションを独自開発していきましょう!

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

PowerShellでユーザーフォームを作る - プログレスバー編 -

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

今回は「PowerShellでユーザーフォームを作る - プログレスバー編 -」です。

プログレスバーとは、容量の大きいデータを移動した時などに表示される、進捗状況をユーザーに明示するものです。

以前、Write-Progressコマンドレットを使用したプログレスバーについての記事を投稿しましたが、今回は.NETを使用したプログレスバーとなります。

<今回の完成品>


※画像は、処理が終了したところ。(バーが全て埋まったところ)

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

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

# プログレスバー

Add-Type -AssemblyName System.Windows.Forms

$Form = New-Object System.Windows.Forms.Form
$Form.Size = "300,200"
$Form.Startposition = "CenterScreen"
$Form.Text = "プログレスバーのテスト"

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "110,20"
$Button.Size = "80,30"
$Button.Text = "開始"

# プログレスバー
$Bar = New-Object System.Windows.Forms.ProgressBar
$Bar.Location = "10,100"
$Bar.Size = "260,30"
$Bar.Maximum = "10"
$Bar.Minimum = "0"
$Bar.Style = "Blocks"

# ボタンのクリックイベント
$Start = {
    For ( $i = 0 ; $i -lt 10 ; $i++ )
    {
        $Bar.Value = $i+1
        start-sleep -s 1
    }
    [System.Windows.Forms.MessageBox]::Show("完了しました", "info")
}
$Button.Add_Click($Start)

$Form.Controls.AddRange(@($Bar,$Button))

$Form.ShowDialog()

---------ここまで-------------------------------------------------------------------------------------

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

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

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

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

# プログレスバー
$Bar = New-Object System.Windows.Forms.ProgressBar
$Bar.Location = "10,100"
$Bar.Size = "260,30"
$Bar.Maximum = "10"
$Bar.Minimum = "0"
$Bar.Style = "Blocks"

ここでは、ProgressBarクラスをインスタンス化し、各種プロパティを設定しています。
Locationプロパティで位置を、Sizeプロパティで長さと幅を指定しています。
MaximumプロパティとMinimumプロパティは名前の通り、最大値と最小値を指定します。
Styleプロパティは描画方法を指定するもので、「Blocks」「Continuous」「Marquee」から選択します。
その違いについては、画像を見ていただければおわかりのことと思います。

Blocks

Continuous

Marquee

さらに、StyleプロパティにMarqueeを指定した場合はMarqueeAnimationSpeedプロパティを指定することで、動く早さを調節することができます。

ここで、(私の環境だけかもしれませんが)謎の現象が起こっていることをお伝えしておきます。

謎1 バーの色が実行方法によって違う。
  PowerShell ISEから実行すると緑色、スクリプトファイルを右クリック→実行すると青色になる。

謎2 PowerShell ISE上では、Blocksを指定してもContinuousと同じ表示になる
  
謎3 Marqueeを指定しても、スクリプトファイルを右クリック→実行するとBlocksになる。

この3つの謎について、詳しくご存知の方がいらっしゃいましたら、コメントいただけると幸いです。


# ボタンのクリックイベント
$Start = {
    For ( $i = 0 ; $i -lt 10 ; $i++ )
    {
        $Bar.Value = $i+1
        start-sleep -s 1
    }
    [System.Windows.Forms.MessageBox]::Show("完了しました", "info")
}
$Button.Add_Click($Start)

ここでは、ボタンのクリックイベントを設定しています。
イベントの内容は、Valueプロパティでブログレスバーの値を1つ増やす+1秒待つ という処理を10回繰り返し、その後、完了メッセージを表示します。

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

解説は以上となります。

容量の大きいファイルや大量のファイルを取り扱う場合、処理に時間がかかっていると、フリーズしたと勘違いする場合があり、✕ボタンを連打し、強制的に終了するなんてこともあります。

そういったことを防ぐためにもプログレスバーを表示するようにし、ちゃんと動いていることを明確にしてあげましょう!

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

PowerShellでユーザーフォームを作る - ドラッグ&ドロップの実装 -

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

今回は「PowerShellでユーザーフォームを作る - ドラッグ&ドロップの実装 -」です。

不特定多数の人が使うようなフォームを作成する場合、一番に考慮しなければいけないのはその操作性で、「誰でも簡単に使える」ようなものにする必要があります。

そんな時に欠かせない機能のひとつが「ドラッグアンドドロップ」です!

データを取得するときに、「ファイル選択ダイアログを開いて…フォルダの階層を辿って…このファイルと、このファイルと、このファイルと・・・」なんて作業をする必要が無くなります!

<今回の完成品>

ドロップしたところ

前置きはこの辺にして、早速スクリプトを記述していきます。

---------ここから-------------------------------------------------------------------------------------
# ドラッグ&ドロップの実装

Add-Type -AssemblyName System.Windows.Forms

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

# リストボックスの生成
$Listbox =  New-Object System.Windows.Forms.ListBox
$Listbox.Location = "10,10"
$Listbox.Size = "260,200"
$Listbox.AllowDrop = $True

# ドラッグエンター イベント
$Enter = {
  $_.Effect = "All"
}
$Listbox.Add_DragEnter($Enter)

# ドラッグドロップ イベント
$Drop = {
    $Name = @($_.Data.GetData("FileDrop"))

    # 1つずつ取得し、リストボックスに追加
    For ( $i = 0 ; $i -lt $Name.Count ; $i++ )
    {
        [void]$Listbox.Items.Add($Name[$i])
    }
}
$Listbox.Add_DragDrop($Drop)

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

$form.Controls.AddRange(@($Listbox,$Button))

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

上記内容をコピーし、PowerShell ISEに貼り付けて、実行すると空のリストボックスが表示されます。
そこに適当なファイル・フォルダをドラッグ&ドロップすると、そのデータのパスが表示されます。

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

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

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

ドラッグ&ドロップを実装するには以下の手順が必要となります。
 手順1 対象コントロールのAllowDropプロパティをTrueにする
 手順2 ドラッグエンターイベントを設定する
 手順3 ドラッグドロップイベントを設定する 

この手順を念頭に置いた上で、サンプルスクリプトを見てみましょう。


$Listbox.AllowDrop = $True

ここで、上記の手順1を実施し、リストボックスへのドラッグ&ドロップを許可しています。
例えば、サンプルスクリプトには他にボタンが設置されていますが、この処理をしていないため、ボタンにデータをドラッグ&ドロップしても何も起こりません。


# ドラッグエンター イベント
$Enter = {
    $_.Effect = "All"
}
$Listbox.Add_DragEnter($Enter)

次に、リストボックスに対してドラッグエンターイベントを設定しています。(上記手順2)
これは、「データがドラッグされた状態でリストボックス上に入ってきた時」に発生します。
DragEventArgsクラスのEffectプロパティは「ドラッグされているデータに対して、どのような操作を行うか」を指定します。
今回は「All」としていますが他の選択肢として「Copy」や「Move」があります。
詳細はDragDropEffects 列挙体を参照ください。

ドラッグエンターイベントがどのタイミングで発生しているのかイマイチわからないという場合は、「$_.Effect = "All"」の部分を「write-host "このタイミングです!!"」に書き換えて、何かしらのデータをドラッグした状態でリストボックス上を行ったり来たりさせてみてください。


# ドラッグドロップ イベント
$Drop = {
    $Name = @($_.Data.GetData("FileDrop"))

    # 1つずつ取得し、リストボックスに追加
    For ( $i = 0 ; $i -lt $Name.Count ; $i++ )
    {
        [void]$Listbox.Items.Add($Name[$i])
    }
}
$Listbox.Add_DragDrop($Drop)

次に、リストボックスに対してドラッグドロップイベントを設定しています。(上記手順3)
これは、「リストボックス上でデータがドロップされた時」に発生します。
まず、DragEventArgsクラスのData.GetDataプロパティでドロップされたデータのパスを配列として取得しています。
その後、For文を用いてリストボックスに追加しています。

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

解説は以上となります。

条件付けによっては対象のデータを絞る(テキストファイルだけ許可する、テキストファイル以外は許可する)ことも可能です。

ドラッグ&ドロップが使えるのと使えないのとでは、その操作性に大きな差が生まれます。
特にデータを取り込む処理を行う場合などは、対象データの指定が格段に楽になりますので、ぜひとも実装して欲しい機能です。

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

PowerShellでユーザーフォームを作る - カラー選択ダイアログを使用する -

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

今回は「PowerShellでユーザーフォームを作る - カラー選択ダイアログを使用する -」です。

色というのは些細なことのようで、意外と重要な役割を持っているんじゃないかと筆者は考えています。

例えば、デフォルトでは背景が白っぽい色で、文字が黒になっています。
白というのは光を多く放っている=目に悪いというようなイメージがあり、長時間見続けていると、眼精疲労などにつながってしまうかもしれません。(あくまで個人的な意見です)

さらに個人の好みという問題もあります。
貴殿が作成したオリジナルソフトを、同じ部署のみんなで使用する場合などは、背景を黒にしたい人、文字は赤にしたい人なども出てくるでしょう。

今回の内容は、そんな場合に備えてぜひ知っておいて欲しいものです。

<今回出てくるダイアログ>


誰でも一度は見たことがあるものだと思います。

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



---------ここから-------------------------------------------------------------------------------------
# カラーダイアログを使用する

# アセンブリの読み込み
Add-Type -assemblyName System.Windows.Forms

# カラーダイアログ
$dialog = New-Object System.Windows.Forms.ColorDialog
$result = $dialog.ShowDialog()

if ( $result -eq "OK" )
{
    $COLOR$dialog.Color
    [System.Windows.Forms.MessageBox]::Show("選択された色は「$COLOR」です", "色")
}
---------ここまで-------------------------------------------------------------------------------------

上記内容をコピーし、PowerShell ISEに貼り付けて、実行するとカラー選択ダイアログが表示されます。
色を選択し、OKボタンを押すとメッセージボックスで選んだ色を表示します。

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

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

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

# カラーダイアログ
$dialog = New-Object System.Windows.Forms.ColorDialog

ここでは、ColorDialogクラスをインスタンス化しています。
カラー選択ダイアログで有用なプロパティを2つご紹介します。
●FullOpenプロパティ
 ・カスタムカラー部分を初めから展開しておくかどうかを指定します。
  (既定値はFalse)
 ・記述例…$dialog.FullOpen = $True

●AllowFullOpenプロパティ
 ・カスタムカラー部分の使用可否を指定します。
  (規定値はFalse)
 ・記述例…$dialog.AllowFullOpen = $True


$result = $dialog.ShowDialog()

ここでダイアログを表示させ、かつ、その結果を受け取り、変数resultに格納しています。


if ( $result -eq "OK" )
{
    $COLOR = $dialog.Color
    [System.Windows.Forms.MessageBox]::Show("選択された色は「$COLOR」です", "色")
}

ここは、変数resultの結果が「OK」であった場合のみ(ダイアログでOKボタンが押された場合のみ)処理される部分です。
内容は、選択された色の情報を変数COLORに格納し、それをメッセージボックスで表示します。

ここでいう「色の情報」には次の内容が含まれています。
 ・R
 ・G
 ・B
 ・A
 ・IsknownColor
 ・IsEmpty
 ・IsNamedColor
 ・IsSystemColor
 ・Name

この中で注目すべきポイントは次の通りです。

1.RGBA
RGBAはRed(赤)・Green(緑)・Blue(青)・Alpha値(透明度)を数値で返します。

2.IsknownColor
IsknownColorは、その色が「よく知られている色か」をTrueかFalseで返します。
例えば基本色の赤を選択した場合はTrueとなり、カスタムカラーを選択した場合はFalseとなります。

3.Name
Nameはそのままずばり色の名前を返します。
例えば基本色の赤を選択した場合は「red」となり、カスタムカラーを選択した場合は16進数値(ffff8000等)を返します。


上記で取得したカラーを、別のコントロールで使用するには、次のように記述します。

# 選択した色を、フォームの背景色に設定
$Form.BackColor = $COLOR
($Form.BackColor = "#" + $COLOR.Name でも可)

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

解説は以上となります。

意外と色にこだわりがある方はいらっしゃいます。
オリジナルフォーム内のオプションのひとつとして実装してみてはいかがでしょうか。

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

PowerShellでユーザーフォームを作る - リンクラベル編 -

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

今回は「PowerShellでユーザーフォームを作る - リンクラベル編 -」です。

リンクラベルというのは、その文字列をクリックすると指定されたページにジャンプしたりする、よくWEBサイト上で使われているものです。

今回は、そのリンクラベルをフォーム上に設置し、クリックすると指定フォルダを起動するよう設定します。

<今回の完成品>


フォーム内の、色と下線がついている部分がリンクラベルです。

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

---------ここから-------------------------------------------------------------------------------------
# PowerShellでユーザーフォームを作る - リンクラベル編 -

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Size = "200,200"
$form.StartPosition = "centerscreen"
$form.Text = "タイトル"

# リンクラベル
$LinkLabel = New-Object System.Windows.Forms.LinkLabel
$LinkLabel.Location = "20,30"
$LinkLabel.Size = "150,30"
$LinkLabel.Text = "ここをクリックしてフォルダを開く"
$form.Controls.Add($LinkLabel)

# リンクラベルのクリックイベント
$JUMP = {
    Invoke-Item -Path "C:\"
}
$LinkLabel.Add_Click($JUMP)

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

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

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

さらに、「ここをクリックしてフォルダを開く」をクリックすると、Cドライブフォルダが表示されます。

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

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

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

# リンクラベル
$LinkLabel = New-Object System.Windows.Forms.LinkLabel
$LinkLabel.Location = "20,30"
$LinkLabel.Size = "150,30"
$LinkLabel.Text = "ここをクリックしてフォルダを開く"

ここでは、LinkLabelクラスをインスタンス化し、各種プロパティを設定しています、
Locationプロパティはフォーム内での位置を、Sizeプロパティはリンクラベルの大きさを、Textプロパティは表示する文字列を設定しています。
これ以外にも、有用なプロパティがありますのでご紹介します。

●LinkColorプロパティ
 ・テキストの色を指定する。(デフォルトは青色)
 ・記述例…$LinkLabel.LinkColor = "Red"
 

●LinkBehaviorプロパティ
 ・リンクラベルの動作を次の4つから指定する。(デフォルトはSystemDefault)
  1.AlwaysUnderLine…常に下線が付く
  2.HoverUnderLine…マウスがテキストの上にある時だけ、下線が付く
  3.NeverUnderLine…下線は付かない(色は付く)
  4.SystemDefault…コントロール パネルまたはInternet Explorer の [インターネット オプション] ダイアログ ボックスで設定されているオプションによって異なる

この記述だけでは、まだ肝心のリンクが設定されていませんので、色と下線が付いたラベルと同じ状態です。
リンクを設定するには別途クリックイベントを記述します。


# リンクラベルのクリックイベント
$JUMP = {
    Invoke-Item -Path "C:\"
}
$LinkLabel.Add_Click($JUMP)

ここでは、リンクラベルに対してクリックイベントを設定しています。
イベントの内容は、Invoke-Itemコマンドレットで、指定したパス(今回はCドライブ)のフォルダを起動します。

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

解説は以上となります。

筆者は主に、「テキストにパスをそのまま表示し、クリックするとそのパスのフォルダを起動する」くらいの使い方しかしていませんが、クリックイベント内の記述に指定はありませんので、例えば「Invoke-Item -Path "C:\"」の部分を、メッセージボックスを表示するように変更しても全然構いません。

アイデア次第では、もっと便利な使い方があるかもしれません。
「こんなふうに使うといいよ!」というご意見がありましたら、ぜひコメントをお寄せください。

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

PowerShellからクリップボードを扱う

$
0
0
PowerShellで実行した処理結果を、クリップボードに送りたい場合があります。・・・よね?

今回はPowerShellからクリップボードへの送信方法と、クリップボードからの取得方法をご紹介していきます。


1.処理結果をクリップボードへ送信する方法 その1

コマンドの実行結果をクリップボードへ送る方法を2つご紹介します。

まず1つ目はパイプを使用する方法です。

下記に簡単なサンプルスクリプトを記述します。

---------ここから-------------------------------------------------------------------------------------
# クリップボードへの送信 その1

Get-ChildItem | Clip

---------ここまで-------------------------------------------------------------------------------------

以上です。・・・と終わってしまっては身も蓋もないですね。

まず、お馴染みの「Get-ChildItem」コマンドレットで、カレントディレクトリ内のアイテムを取得しています。

そしてパイプを使用して「Clip」と記述します。

実際、これだけで、コマンド結果がクリップボードに送信されています。
試しに、上記を実行後、メモ帳などを開いて貼り付けを行ってみてください。
コマンド結果が貼り付けられるはずです。

しかしここで問題が発生している方もいらっしゃるのではないでしょうか。

そうです、日本語の部分が文字化けし、「????」となってしまいます。
(問題ないという方は読み飛ばしてください)

この問題は、PowerShellの仕様上のエンコードがUS-ASCIIとなっていることが原因です。
(PowerShellを起動し、「$OutputEncoding」と入力してみるとわかります)

文字化けを回避するには、一時的にエンコードを変更したうえで、コマンドを実行し、クリップボードへ送信する必要があります。

そのためには次のように記述します。

---------ここから-------------------------------------------------------------------------------------
# クリップボードへの送信 その1改

$OutputEncoding = [console]::OutputEncoding;

Get-ChildItem | Clip

---------ここまで-------------------------------------------------------------------------------------

上記の「$OutputEncoding = [console]::OutputEncoding;」の部分でエンコードを変更しています。

この一文をつけることによって、日本語が文字化けしなくなります。



2.処理結果をクリップボードへ送信する方法 その2

処理結果をクリップボードへ送信する、もうひとつの方法はClipboardクラスを使用する方法です。

下記にサンプルスクリプトを記述します。

---------ここから-------------------------------------------------------------------------------------
# クリップボードへの送信 その2

# アセンブリの読み込み
Add-Type -Assembly System.Windows.Forms

# カレントディレクトリ内のアイテムを取得
$Item = Get-ChildItem

# 取得したアイテムをテキストとしてクリップボードへ送信
[Windows.Forms.Clipboard]::SetText($Item)

---------ここまで-------------------------------------------------------------------------------------

このように記述すると、コマンド実行結果をクリップボードへ送ることができます。
ただし、この方法の場合は、Get-ChildItemコマンドレットを実行した結果のうち、Nameの部分だけが送られていることに注意してください。


3.クリップボードから取得する方法

続いて、クリップボードの内容をPowerShellで取得する方法をご紹介します。

取得する場合も上記2で使用したClipboardクラスを用います。

---------ここから-------------------------------------------------------------------------------------
# クリップボードへからの取得

# アセンブリの読み込み
Add-Type -Assembly System.Windows.Forms

# クリップボードから取得
$Get = [Windows.Forms.Clipboard]::GetText()

---------ここまで-------------------------------------------------------------------------------------

このように記述することで、現在クリップボードにあるテキストを取得することができます。

Clipboardクラスの詳細についてはこちらを参照ください。



今回の内容は、あまり出番がないかもしれませんが、知っておくに越したことはないと思い、ご紹介させていただきました。

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


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