ここではPowerShellの文法を簡単にまとめておきます。
目次
基礎文法 - Hello World
コンソールに文字表示
Write-Host
コマンドレットを使用します。Write-Host "Hello world"
基礎文法 - コメント
-
コメントには
#
を使用します。# ここはコメント
-
複数行コメントには
<#
と#>
を使用します。<# ここは複数行 コメントです。 >
基礎文法 - 式の途中で改行する
-
式の途中で改行するには
バッククォート(`)
を使用します。ちなみにWindows Batchの方ではサーカムフレックス(^)
を利用していましたね。New-Item "c:\temp\myfile.txt" ` -type file ` -value "test"
-
パイプ
(|)
を後ろに置く場合はバッククォート(`)
無しで改行できます。Get-Process | Where-Object {$_.CPU -gt 500} | Select-Object -first 3
参考
基礎文法 - 変数宣言
-
PowerShellでは変数は頭に
$
を付けて宣言します。 -
変数宣言をしていなくても使用可能で、どのような型でも代入が可能です。
$a = 1 $items = Get-ChildItem # コマンドレットの戻り値を格納
-
型を明示的に指定することも可能です。型は
[型]
という形式で$
の前に付けます。[int]$i = 10
-
指定できる型については基礎文法 - 型を参照。
-
明示的に型を指定した場合、その型以外を代入しようとするとエラーとなります。
違う方を代入しようとするとエラーになるPS C:\Users\fumo> [int]$i = 10 PS C:\Users\fumo> $i = 'a' 値 "a" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。" 発生場所 行:1 文字:1 + $i = 'a' + ~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
基礎文法 - スコープ
- PowerShellはダイナミックスコープを採用しています。
- スコープを生成するものは、以下の3種類。
- 関数の実行
- スクリプト ブロックの実行
- スクリプト ファイルの実行
- 以下のようなものはスコープを生成しません。
if
やfor
といった制御構文try
-catch
-finally
begin
-process
-end
明示的なスコープの読み取り
-
スコープの種類は、
global
、script
、local
、private
の4種類あります。 -
スコープ修飾子を指定しなかった場合は
local
となります。$global:x = 10 $script:x = 20 $local:x = 30
-
global
はコンソール上でのスコープです。(一番外側) -
script
はスクリプト内(.ps1)でのスコープです。 -
local
はスコープのところで書いた*スコープが生成される範囲内`でのスコープです。 -
private
だけちょっと毛色が違っていて、宣言したスコープよりも子のスコープから見えなくなるものです。 -
スコープについては詳しくはこちらがとても参考になります。
基礎文法 - 型
- PowerShellの型とそのエイリアスです。
エリアス | .NET Framework |
---|---|
byte | System.Byte |
int | System.Int32 |
long | System.Int64 |
double | System.Double |
decimal | System.Decimal |
char | System.Char |
bool | System.Boolean |
string | System.String |
array | System.Array |
xml | System.Xml.XmlDocument |
type | System.Type |
DateTime | System.DateTime |
参考
基礎文法 - 演算子
比較演算子
PowerShell | C系言語 | 説明 |
---|---|---|
-eq | == | 等しい |
-ne | != | 等しくない |
-gt | > | より大きい |
-ge | >= | 以上 |
-lt | < | より小さい |
-le | <= | 以下 |
-like | なし | ワイルドカードと等しい |
-notlike | なし | ワイルドカードと等しくない |
-match | なし | 正規表現と等しい |
-notmatch | なし | 正規表現と等しくない |
算術演算子
PowerShell | C系言語 | 説明 |
---|---|---|
+ | + | 加算 |
- | - | 減算/符号反転 |
* | * | 乗算 |
/ | / | 除算 |
% | % | 余剰 |
[Math]::Pow(x,y) | pow(x,y) | べき乗(xのy乗) |
= | = | 代入 |
+= | += | 加算代入 |
-= | -= | 減算代入 |
*= | *= | 乗算代入 |
/= | /= | 除算代入 |
%= | %= | 剰余代入 |
++ | ++ | インクリメント |
-- | -- | デクリメント |
論理演算子
PowerShell | C系言語 | 説明 |
---|---|---|
-and | && | AND |
-or | || | OR |
-not または ! | ! | NOT |
ビット演算子
PowerShell | C系言語 | 説明 |
---|---|---|
-band | & | AND |
-bor | | | OR |
-bnot | ! | NOT |
-bxor | ^ | XOR |
-shl | << | 左シフト |
-shr | >> | 右シフト |
型演算
PowerShell | 説明 |
---|---|
$a -is [型] | 型と等しい |
$a -isnot [型] | 型と等しくない |
$a -as [型] | 型へキャスティング、失敗時は $null |
[型]$a | 型へキャスティング(失敗時はエラー) |
- 指定できる型については基礎文法 - 型を参照。
参考
基礎文法 - 条件分岐
if-elseif-else
if
if (Boolean_expression) { // Executes when the Boolean expression is true }
if-else
if (Boolean_expression) { // Executes when the Boolean expression is true } else { // Executes when the Boolean expression is false }
if-elseif-else
if (Boolean_expression 1) { // Executes when the Boolean expression 1 is true } elseif (Boolean_expression 2) { // Executes when the Boolean expression 2 is true } elseif (Boolean_expression 3) { // Executes when the Boolean expression 3 is true } else { // Executes when the none of the above condition is true. }
例
$filesize = 2MB if ($filesize -lt 1MB) { Write-Host "1MBより小さい" } elseif ($filesize -lt 2MB) { Write-Host "2MBより小さい" } else { Write-Host "2MB以上" }
- この例の場合、
$filesize
が2MB以上のため、else
に入り、2MB以上
と出力されます。 -lt
は比較演算子
です。利用可能な比較演算子は比較演算子を参照ください。- (寄り道) PowerShellではメガバイト
MB
のようなサイズ単位の定数が利用できます。
出力結果
2MB以上
参考
文字列 - 複数行文字列
- いわゆるヒアドキュメントです。
- PowerShellでは
@"
と"@
で囲むか、@'
と'@
で囲みます。 - ダブルクォーテーションを使用した場合、文字列内の変数は展開されます。
0017_string.ps1
$a = 'あいう' # 変数展開あり $str1 = @" ヒアドキュメントでは複数行のテキストを 1つの文字列として扱います。 変数`$aの値は$($a)です。 "@ # 変数展開なし $str2 = @' ヒアドキュメントでは複数行のテキストを 1つの文字列として扱います。 変数`$aの値は$($a)です。 '@ Write-Host $str1 Write-Host ('-' * 20) Write-Host $str2
出力結果
PS C:\temp> .\0017_string.ps1 ヒアドキュメントでは複数行のテキストを 1つの文字列として扱います。 変数$aの値はあいうです。 -------------------- ヒアドキュメントでは複数行のテキストを 1つの文字列として扱います。 変数`$aの値は$($a)です。
参考
関数 - 関数宣言
- 関数は
function
キーワードを使って宣言します。 - 引数を書く位置は、変数名の後の
()
の中か、本体の先頭部分のParam()
の中のどちらかです1。 - 戻り値は
return
キーワードのを使って書きます。# 引数なし function 関数名 { # 処理本体 return 戻り値 } function 関数名() { # 処理本体 return 戻り値 } # 引数あり function 関数名(引数1, 引数2, …) { # 処理本体 return 戻り値 } function 関数名 { Param( 引数1, 引数2, … ) # 処理本体 return 戻り値 }
関数 - 可変長引数
- 可変長引数は変数
$args
という配列に渡されます。 - 普通に引数を渡した関数内でも
$args
で配列は参照できます。- その際、普通の引数に指定した方に先に値が割り当てられていき、残った部分が
$args
に割り当てられます。
- その際、普通の引数に指定した方に先に値が割り当てられていき、残った部分が
function_variable_length_parameter.ps1
function foo { Write-Host $args.Count foreach($i in $args) { Write-Host $i } } function bar($a, $b) { Write-Host "$($args.Count) a=$a b=$b" foreach($i in $args) { Write-Host $i } } # 呼び出し Write-Host '--- call foo' foo a b あいう Write-Host '--- call bar 1' bar 10 20 a b c あいう # $a, $bに10, 20が割り当てられ、それ以降が$argsに割り当てられる Write-Host '--- call bar 2' bar 10 20 # $a, $bに10, 20が割り当てられ、$argsには何も割り当てられず空リストになる
出力結果
PS C:\temp> .\function_variable_length_parameter.ps1 --- call foo 3 a b あいう --- call bar 1 4 a=10 b=20 a b c あいう --- call bar 2 0 a=10 b=20
関数 - 値渡し、参照渡し
- 値渡しは通常の操作です。関数の中で書き換えても呼び出し元の方の変数へは影響が及びません。
- 参照渡しをするには、変数にを
ref型
に変換([ref]
を付ける)して渡します。- 以下の例では、受け取る引数の方も
[ref]
を付けていますが、これは必須ではありません(省略可)。 - ただ、明示的に
[ref]
を付けておいたほうが、参照渡しであることが分かりやすいので、付けておいたほうがいいかもしれません。
- 以下の例では、受け取る引数の方も
function_args_byval_byref.ps1
# 値渡し function byVal($arg) { $arg = 'Good bye!' Write-Host "in function(byVal): $arg" } # 参照渡し function byRef([ref]$arg) { $arg.Value = 'Good bye!' Write-Host "in function(byRef): $($arg.Value)" } function byRef2($arg) { $arg.Value += '!!' Write-Host "in function(byRef2): $($arg.Value)" } $str = 'Hello' $str byVal $str # 値渡し $str # => Hello のまま byRef([ref]$str) # 参照渡し $str # => Good bye! に書き換わっている byRef2([ref]$str) # 参照渡し $str # => Good bye!!! に書き換わっている
出力結果
PS C:\temp> .\function_args_byval_byref.ps1 Hello in function(byVal): Good bye! Hello in function(byRef): Good bye! Good bye! in function(byRef2): Good bye!!! Good bye!!!
関数 - 引数のデフォルト値
- 引数のデフォルト値を設定できます。
- 関数呼び出しの時に省略すると、その値が設定されます。
- 明示的に指定して上書きすることもできます。
function_args_default_value.ps1
function foo($arg = 10) { Write-Host "値は$($arg)です。" } function bar($arg1, $arg2 = 10) { Write-Host "値は$($arg1)と$($arg2)です。" } foo # => 省略しているので、デフォルト値の10が出力される foo 20 # => 上書きして、20が出力される bar 15 # => $arg1に15が入って、$arg2はデフォルト値の10が入る bar 15 25 # => $arg1に15が入って、$arg2は上書きして25が入る
出力結果
PS C:\temp> .\function_args_default_value.ps1 値は10です。 値は20です。 値は15と10です。 値は15と25です。
コレクション - ハッシュテーブル
ハッシュテーブルに初期値とともに宣言する場合は、@{}
の中に名前=値
の形式で記述します。
改行
か;
で区切ると複数名前を値の組を指定できます。
@{ <名前1> = <値1>; [<名前2> = <値2> ] ...}
@{ <名前1> = <値1> [<名前2> = <値2>] : : }
- なお、空のハッシュテーブルを宣言するには、
@{}
のみとします。
参考
参考
参考サイト
- (hakeの日記) PowerShell - 関数(可変長引数)
- (hakeの日記) PowerShell - 関数(値渡しと参照渡し)
- (HIRO's.NET) 03.引数を省略可能にするには
- (HIRO's.NET) 06.値渡しと参照渡し
- (Microsoft Ignite) about_Hash_Tables
- (PowerShell Scripting Weblog) PowerShell基礎文法最速マスター
- (tutorialspoint) Powershell - If Else Statement
- (Windows にまつわる e.t.c.) PowerShellの演算子
- (Windows にまつわる e.t.c.) PowerShell のハッシュテーブルの使い方
- (バヤシタ) ソースコードの式の途中で改行する方法
- (バヤシタ) ヒアドキュメントを使って複数行を 1 つの文字列にする
- (鷲ノ巣) PowerShell のスコープ完全に理解した
ソース
- (language-examples) 0005_if.ps1
- (language-examples) 0015_operator.ps1
- (language-examples) 0017_string.ps1
-
両方に書くと「function の宣言に引数が指定されている場合、param ステートメントを使用できません。」というエラーになります。 ↩︎