SEブログ

【PowerShell】Read-Hostコマンドレットを使ってみる

 

こんにちは!

 

PowerShell の Read-Host コマンドレットを使って、ユーザー名や社員番号といったユーザーアカウント情報を変数に代入し、表示してみましょう。

 

 

スポンサーリンク

Read-Host コマンドの説明

 

 

対話的に、ユーザーに入力を求める事ができます。

例えば、以下のようにユーザー名を入力するようにプロンプトを表示し、入力した値を、変数の $Name に代入する事ができます。

 

ここで $Name に代入する値は、文字列型としますので、明示的に [string] と書いておきます。

 

PS C:\Users\User> [string]$username = Read-Host "ユーザー名を入力してください。"
ユーザー名を入力してください。: urashima  ← 入力したら Enter キーを押します。

PS C:\Users\User> $username
urashima ← 上で入力したユーザー名が表示されました。

 

 

今度は、社員番号を入力するようにし、入力した値を、変数の $staff_id に代入します。

$staff_id に代入する値は整数型とし、文字列型は不可としますので、明示的に [int] と書いておきます。

 

PS C:\Users\User> [int]$staff_id = Read-Host "社員番号を入力してください。"
社員番号を入力してください。: 1001 ← 入力したら Enter キーを押します。

PS C:\Users\User> $staff_id
1001 ← 上で入力した社員番号が表示されました。

 

 

今度は、入社年月日を入力するようにし、入力した値を、変数の $date に代入します。

年月日を表示したいので、明示的に [datetime] と書いておきます。

 

PS C:\Users\User> [datetime]$date = Read-Host "入社年月日を入力してください。" Date-Format: yyyy/mm/dd
入社年月日を入力してください。 Date-Format: yyyy/mm/dd: 2010/10/10 ← 入力したら Enter キーを押します。

PS C:\Users\User> $date
2010年10月10日 0:00:00 ← 上で入力した入社日が表示されました。

 

 

こんな感じで、文字列や数値を変数に格納し、変数から値を表示する事ができます。

それでは、パスワードのようにセキュリティー的に見えてはいけないような値はどう扱えば良いでしょうか。

 

こういう場合は、-AsSecureString パラメーターを使います。

 

PS C:\Users\User> $password = Read-Host "パスワードを入力してください。" -AsSecureString

# パスワードの入力ポップアップが表示されます。(下画像)パスワードを入力して [OK] をクリックします。

PS C:\Users\User> $password
System.Security.SecureString  ← 入力したパスワードは表示されません。

 

 

さて、今度は入力する値の文字数や桁数を制限するにはどうしたらよいでしょうか。

例えば、上の方法ではユーザー名に aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbccccccccccccc とか入力できてしまいます。

ユーザー名は企業では文字数が限られていますので、文字数を制限するようにしてみます。

ここでは以下の構文を使い、6 ~ 8 文字までの制限とします。

 

構文: [ValidateLength(int 最小値, int 最大値)]

 

PS C:\Users\User> [ValidateLength(6,8)]$username = [String](Read-Host "ユーザー名を入力してください。")
ユーザー名を入力してください。: aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbcccccccccccccccc
値 aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbcccccccccccccccc は username 変数の有効な値ではないため、変数を検証できません。
発生場所 行:1 文字:1
+ [ValidateLength(6,8)]$username = [String](Read-Host "ユーザー名を入力してください。" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ValidationMetadataException
+ FullyQualifiedErrorId : ValidateSetFailure


PS C:\Users\User> [ValidateLength(6,8)]$username = [String](Read-Host "ユーザー名を入力してください。")
ユーザー名を入力してください。: urashima  ← 入力したパスワードは表示されません。

PS C:\Users\User> $username
urashima

 

 

では、社員番号のように番号を制限したい場合はどうすればよいでしょうか。

ここでは以下の構文を使い、1 から 9999 までとします。

 

構文: [ValidateRange(object 最小値, object 最大値)]

 

PS C:\Users\User> [ValidateRange(1,9999)]$staff_id = [int](Read-Host "社員番号を入力してください。")
社員番号を入力してください。: 0
値 0 は staff_id 変数の有効な値ではないため、変数を検証できません。
発生場所 行:1 文字:1
+ [ValidateRange(1,9999)]$staff_id = [int](Read-Host "社員番号を入力してください。")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ValidationMetadataException
+ FullyQualifiedErrorId : ValidateSetFailure


PS C:\Users\User> [ValidateRange(1,9999)]$staff_id = [int](Read-Host "社員番号を入力してください。")
社員番号を入力してください。: 1

PS C:\Users\User> $staff_id
1

 

 

今度は、入力に選択肢を持ちたい場合、A, B, C や Yes, No など選んでもらいます。

例えば、PC の種類はノートパソコンかどうか聞きたい場合、以下のように書いてみます。

 

構文: [ValidateSet(params string[])]

 

PS C:\Users\User> [ValidateSet("y","Y","n","N")]$responce = Read-Host "この PC はノートパソコンですか?(y か n を入力して Enter 押下)"
この PC はノートパソコンですか?(y か n を入力して Enter 押下): y

PS C:\Users\User> $response
y

 

 

とりあえず、Read-Host コマンドレットはここまでとします。

 

いかがでしょうか。

このようにユーザーと対話的にできるので、入力した値に合わせた処理ができるようになります。

 

 

それでは最後までお読みいただきありがとうございました!