PowerShellはいろんなところに落とし穴があります。 連想配列の初期化時、カンマではなくセミコロンで区切ること、 Write-Hostや自作関数のコール時、引数を括弧で囲むかどうかで変なエラーの原因になることが多く、 延々悩む羽目になりました。
#
# 注意!PowerShellの場合、このスクリプトをSJISで書くこと。UTF-8で書いてはいけない
# UTF-8でコメントを書いてしまうと、Write-Ouputの出力がないなど変な動作になる
# 2022/06/12
#
# ◆文字列から"b"の文字が最初に現れる位置(先頭が0)を得る
$a = "orange melon strawberry grape"
[Int32]$n = $a.IndexOf("b")
# 18
Write-Host $n
# ◆その位置から5文字を切り出す
[string]$b = $a.Substring($n, 5)
Write-Host $b
# ◆文字列の一部置き換え
Write-Host($a -replace "mel", "lem")
# ◆数値と文字列をそれぞれ加算、文字列連結する
[double]$v1 = 10.2
[string]$v2 = "15.3"
# 25.5 10.215.3 25.5 15.310.2
# 普通に+演算子を使うと、前側のオペランドのデータ型に合わせようとする
# [double]などデータ型の宣言有無を問わず、エラーにはならない
# +演算子のデータ型を強制したいなら[string]などで変換する
$v3 = $v1 + $v2
$v4 = [string]$v1 + $v2
$v5 = [double]$v2 + $v1
$v6 = $v2 + $v1
Write-Host "$v3 $v4 $v5 $v6"
# ◆配列の3番目の要素から3個を取り出し、文字列に連結して出力する
# 要素数が2個以上の配列の初期化時は、@()は付けても付けなくてもよい
#$arr = @("orange", "melon", "strawberry", "grape", "apple", "banana")
$arr = "orange", "melon", "strawberry", "grape", "apple", "banana"
$arrsub = $arr[2..4]
# strawberry graph apple
Write-Host ($arrsub -join " ")
# ◆要素の追加
$arr += "peach"
# ◆要素の検索
$index = [array]::IndexOf($arr, "peach")
Write-Host("index of 'peach' is:${index}")
# ◆配列要素を変数に一括代入する
$e1, $e2, $e3 = $arrsub
# strawberry graph apple
Write-Host "$e1 $e2 $e3"
# 1行に書く場合はカンマではなくセミコロンで区切る。改行する場合はどちらも不要
# また連想配列の場合は@{}は要素数に関わらず省略できない
$harr = @{"orange"=80; "melon"=1200; "strawberry"=350}
$harr["grape"] = 450
# 以下も同じ意味
#$harr.grape = 450
# ◆配列キーの存在有無をチェックする
# PowerShellではアクセスした結果がnullかどうかで判定する
# 三項演算子はまもなくサポートされるらしい
# yes
if($harr["melon"] -ne $null){
Write-Host yes
} else {
Write-Host no
}
# no
if($harr["lemon"] -ne $null){
Write-Host yes
} else {
Write-Host no
}
# ◆配列キー一覧をソートして、キーと値を出力する
$harr.GetEnumerator() | Sort -Property key | %{
# 括弧は省略できない
Write-Host("{0}`t{1}" -f $_.key, $_.value)
}
# ◆既定値付き引数を持つ関数を定義する。PHP/Python/jsと同じ方法
function GetFileNames ($dir, $ext = "") {
if ($ext -eq "") {
$files = Get-ChildItem $dir -File
} else {
$files = Get-ChildItem $dir -File -Filter *${ext}
}
$names = @()
foreach($f in $files){ $names += $f.Name }
return $names
}
# 自作関数の引数を括弧で囲まないこと。連結した1つの引数になってしまう
$names = GetFileNames .
Write-Host $names
$names = GetFileNames . .txt
Write-Host $names
# ◆可変長引数を持つ関数を定義する。組込変数$argsを参照する
function GetSum(){
$sum = 0
foreach($v in $args){ $sum += $v }
return $sum
}
# 46
$v = GetSum 10 11 12 13
Write-Host $v
# end.