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

PowerShell

【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 コマンドレットはここまでとします。

 

いかがでしょうか。

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

 

 

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

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りでマイペースな人です。

人気記事

1

こんにちは!SE ブログの相馬です。       今回は、PC に適用されている GPO を確認する方法について書きました。     グループポリシー ...

2

こんにちは!SE ブログの相馬です。       今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは ...

3

こんにちは!SE ブログの相馬です。       今回は、グループポリシーを使って、特定のコンピューターに対して、ドメインユーザーに Administrators 権限を ...

4

こんにちは!SE ブログの相馬です。       今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 ...

5

こんにちは!SEブログの相馬です。       今回は、ユーザープロファイルを削除する方法について書いてみました。     1 台の PC を複数人で ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!SE ブログの相馬です。       今回は、Windows Server 2016 で NTP サーバーと同期する方法について書きました。   & ...

-PowerShell
-