【PowerShellでやさしいプログラミング】第3回:変数

こんにちは、けいぞうです。

前回の記事「PowerShellの基本的な使い方」は以下です。

今回は「変数」をテーマに進めていきます。

変数とは

変数とは、一時的に情報を保存しておくための箱のような物です。

プログラムを実行するときに、コンピュータは様々な情報を記憶しておく必要があり、その情報の保管場所として変数を使います。

例えば
ユーザーが入力した「名前」「生年月日」「年齢」を画面に表示する
というプログラムを作るとします。

この時、処理の流れとしては、以下の通りになります

  • ユーザーに画面から名前・生年月日・年齢を入力してもらう
  • 入力してもらった値をそれぞれ名前・生年月日・年齢を格納する変数に入れる
  • それぞれの変数から値を取り出して、画面に表示する

名前を「入力」して「変数に格納」して「画面に表示」する処理イメージ

変数の識別子

変数には名前をつける必要があります。
どの情報をどの箱に入れたか分かるようにしておくためですね。

プログラミングでは、この名前のことを一般的に「識別子」と呼びます。
変数の名前ことなので「変数名」と呼んだりもします。

変数名の付け方にはプログラミング言語によって異なるのですが、
PowerShellの変数名のルールは以下です

  • $から始まる
  • 使用できる文字は数字、アルファベット、アンダースコア( _ )
  • アルファベットの大文字と小文字は区別しない

ざっくり上記の3のルールからなります。

例えば、名前の変数なら
$name

生年月日の変数なら
$birthday

年齢の変数なら
$age

みたいな感じで、英数字しか使えないのでたいてい英語で作ることが多いです。

複数人の氏名を入力してもらう場合は
$name1, $name2, $name3・・・といった形で数字を使ったりします。

変数名にアンダースコアを利用できると書きましたが
$_
これだけは使うことができません。

$_」は特殊な使い方をする変数で、既に最初から用意されているものだからです。

詳しくはコチラ⇩

変数の型

変数には””(かた)という考え方があります。
これは、変数の中に入っている値がどんな種類なのか?ということを決めるものになります。

よく使うは以下です。

  • 文字列型(String)
  • 数値型(Int32など)
  • 日付型(DateTime)
  • 真偽値(Boolean)

PowerShellでは変数に値を入れたら自動で型を認識してくれます。

文字列型は文字通り文字列を扱う型です。
“”(ダブルクオーテーション)や”(シングルクオーテーション)で囲みます。

$StrValue = “これが文字列型ABCDEFGPOWERSHELL”

数値型には整数を扱う型や小数を扱う型などがあります。
クオーテーションで囲わずに数字だけでしています。

$IntValue = 12345

日付型は年月日時分秒が入っている型です。
例えばGet-Dateコマンドを打つと今の年月日時分秒を取得することが出来ます。

$nowDate = Get-Date
Write-Host $nowDate
>2020年7月19日 22:17:10

真偽値はTrueなのかFalseなのかどちらかを表す型になります。
PowerShellでは真を$true、偽を$falseで表します。

$Flag = $true

PowerShellで変数の型を確認するにはその変数に「.GetType()」をつけます

整数値の数値型にはInt32とかInt64とか種類があるのですが
この数字の部分は、変数に格納することが出来る値の最大値を意味します。

詳しくは⇩の記事を参照。

変数を使ってみる

では、これまで説明した内容を使って
実際に簡単なプログラムを作っていきましょう。

先ほどの例にもあげた
ユーザーが入力した「名前」「生年月日」「年齢」を画面に表示する
を今回は作っていきます。

Write-Hostコマンドは画面に出力させるコマンドでしたよね。
今回は画面から入力させる必要がありますが、Read-Hostというコマンドを使います。

<受け取る変数> = Read-Host “表示したいメッセージ”

例えば、名前を入力させたい場合はこんな風に書きます。

$name = Read-Host “名前を入力してください”

これを実行するとこうなります。

Windows PowerSheII 
$name - 
Read-Host

入力してみましょう。

"WindowsPowerShell 
PS C:%work> 
$name 
Read-Host 
月 リ 入 刀 し て く に き し 、 
名 前 を 入 力 し て く だ さ い . け い ぞ う 
PS C:%work>

入力したら「$name」と打ってみてください。
$nameの中身を取り出して表示することが出来ます。

Windows PowerSheII 
PS C'. 
$name 
PS

PowerShellでは変数をただ書いただけで中身を表示してくれますが
そうではないプログラミング言語もあります。(そうではない方が一般的かも)

その場合は画面に出力することを明示的に書いてあげる必要があります。
PowerShellの場合は、Write-Hostコマンドですね。

Windows PowerSheII 
PS C: Wr ite-Host 
$name

Write-Hostの前後に文字をくっつけて、こんな風に出力することもできます。

Windows PowerSheII 
PS Write 
t-sZfitl(t 
-Host 
$name 
e h, -c Y nac

実際に作ってみる

こんな感じで氏名・生年月日・年齢を入力してもらって
画面に表示するプログラムを作成していきましょう。

まずは空のps1ファイルを作成しましょう。

ここでは例として、
C:\work\Script\TEST」フォルダの中に
VariableTest.ps1」というps1ファイルを作成します。
※Variableは変数という意味です。

ps1ファイルを作成したらそれをエディターを開きます。

PowerShell ISEを使う人はPowerShell ISE
VSCodeを使うひとはVSCodeで開いてください
※この記事では全てVSCodeを例として話を進めていきますね。

左上のFileから「Open File」を選択

dPH 09 Man - 一 BE 一 
0 + D 
0 + D Y+PD 
N+WO 
; ed 一 0m0- ℃ 一 
MOPUIM'••"BN 
uadO 
: 一 uadO

先ほど作った「VariableTest.ps1」を選択して「開く」をクリック

PC Application Volume (C:) work Script TEST 
%riabIeTest.psI 
2020/07/19 u

こんな感じで空っぽのファイルが開きます

File Edit Selection View 
VariableTestps1 X 
c > work > Script > TEST > 
Go 
Run Terminal 
VariableTest.ps1 
Help 
VariableTest.psI 
- Visual Studio Code 
p 
PROBLEMS OUTPUT 
DEBUG CONSOLE 
TERMINAL

そしたら、早速ここにプログラムを書いていきましょう!!

出来上がったものがコチラになります⇩

VanableTestps1 X 
c >work)Script >TEST> 》 - VariableTest. PSI > . 
1 
4 
フ 
18 
13 
15 
1 フ 
# 名 前 を 入 力 し て も ら う 
$ n 旧 = Read-Host " 名 前 を 入 力 し て く だ さ い ( 例 : 山 田 太 即 ) 
# 生 年 月 日 を 入 力 し て も ら う 
$birthday = Read-Host " 生 年 月 日 を 入 力 し て く だ さ い ( 例 : 年 1 月 1 日 ) 
# 年 齡 を 入 力 し て も ら う 
Sage = Read-Host " 年 齡 を 入 力 し て く だ さ い ( 例 : 25 ) 
# 名 前 を 表 示 
Write-Host " : 名 有 : ・ $name 
# 生 年 月 日 を 表 示 
Write-Host " 生 年 月 日 : "$birthday 
# 年 齡 を 表 示 
Write-Host " 年 齡 : $agd

書き終わったらファイルを保存しましょう。
左上のFileからSaveで保存、またはCtrlキーを押しながらSキーで保存ができます。

保存したら実行してみましょう。
VSCodeの下に表示されているのウィンドウをターミナルウィンドウと呼びます。ここで実行します。

実行の仕方は普通のPowerShellと同じ。

カレントディレクトリを「C:\work\Script\TEST」に移動させて
VariableTest.ps1」を実行するだけです。

PROBLEMS OUTPUT DEBUG CONSOLE 
PS C : \純rk\5ロ 、 ipt\TEST> . Wariab1eTest. P51 
名 前 を 入 力 し て く だ さ い ( 例 : 山 田 太 即 ) : け い そ う 
生 年 月 日 を 入 力 し て く だ さ い ( 例 : 2e 年 1 月 1 日 ) : 2e2e 1 1 日 
年 齡 を 入 力 し て く だ さ い ( 例 : 25 ) 
名 前 : け い そ う 
生 年 月 日 : 2e2e 年 1 月 1 日 
年 帛 : 25 
PS C : \純rk\5ロ 、 ipt\TEST> ー

無事入力した情報を出力させることができました~!

文字化けする場合

実行したらターミナルウィンドウに日本語が表示されるはずですが
読めない気持ち悪い文字が表示されてしまうことがあります。

⇩こんな感じ

PROBLEMS OUTPUT DEBUG CONSOLE TERMINAL 
PS C: .\Variab1eTest. PSI 
• fit • 
Read-Host

これは文字コードというものの設定が関係しています。
※ここでは細かい話は抜きとします

文字コードの設定は右下の表示で確認できます。

Ln 17, Col 21 Spaces: 4 UTF-8 CRLF PowerSheII Starting PowerSheII„.

この「UTF-8」というのが文字コードの一種です。
どうやら、ここがUTF-8になっていると文字化けしてしまうようです。

UTF-8の部分をクリックすると、上部に⇩のような選択肢が出てくるので
Save the Encoding」を選択

Select Action 
Reopen "ith Encoding 
Save with Encoding

すると文字コード種類が一覧で出てきます。

select File Encoding to Save with 
UTF-8 
UTF-8 with 80M utf8bom 
UTF-16 LE utf161e 
UTF-16 BE utf16be 
western (Windows 1252) windowsi252 
western (ISO 8859-1) is088591 
western (ISO 8859-3) is088593 
western (ISO 8859-15) is0885915 
Westem (Mac Roman) macroman 
DOS (CP 437) cp437 
Arabic (Windows 1256) windowsi256 
Arabic (ISO 8859-6) is088596 
Baltic (Windows 1257) windowsi257 
Baltic (ISO 8859-4) is088594 
Celtic (ISO 8859-14) is0885914 
Central European (Windows 1250) windows1250 
central European (ISO 8859-2) is088592 
central European (CP 852) cp852

ここに「Shift JIS」と入力
出てきた「Japanese(Shift JIS)」を選択してください。

Shift JIS 
Japanese (Shift JIS) shiftjis

もう一度実行してみてください。
きっと日本語がちゃんと表示されたと思います。

練習問題

問題

「昨日の天気」と「今日の天気」を入力してもらい、入力した情報を使って以下のように画面に表示させるプログラムを作ってみましょう。
・昨日の天気は○○、今日の天気は××です。

答え

c >work)Script >TEST> 》 - WeatherTest. P51 ) . 
1 
4 
フ 
# 昨 日 の 天 気 を 入 力 し て も ら う 
$yesterdayweather = Read-Host " 昨 日 の 天 気 を 入 力 し て く だ さ い 。 
す 今 日 の 天 気 を 入 力 し て も ら う 
$todayweather = Read-Host " 今 日 の 天 気 を 入 力 し て く だ さ い 。 
# 結 果 を 表 示 
Write-Host " 昨 日 の 天 気 は $yesterdayweather 今 日 の 天 気 は $todayweather で す 。
PROBLEMS OUTPUT DEBUG CONSOLE 
PS C : \純rk\5ロ 、 ipt\TEST> . \WeatherTest. P51 
昨 日 の 天 気 を 入 力 し て く だ さ い 。 
晴 れ 
今 日 の 天 気 を 入 力 し て く だ さ い 。 : 雨 
昨 日 の 天 気 は 晴 れ 今 日 の 天 気 は 雨 で す 。 
PS C : \純rk\5ロ 、 ipt\TEST> ー