4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShell入門について

Last updated at Posted at 2019-09-15

PowerShell も 初心者未満1ですが…

ずばりこちらの記事がおきにいりです。

もっともわたしは「想定読者」の条件にあてはまりませんが、とてもおもしろくよめました。

しかし僭越ながらツッコミっぽいことを…

パイプ Oriented 環境、PowerShell」についてです。

cat test.csv | awk -F, '{print $2}'


の PowerShell 代替が

> ```powershell
cat test.csv | %{ $_.Split(",")[1] }

とのことですが、じゃあ awk -F, '{print $2, $NF}' の代替は?とおもったときに答えをみつけるのにやや苦労しました2――こうするのかなと:

cat test.csv | % { $_.Split(',')[1, -1] -join ' ' }

つぎに

cat test.csv | awk -F, 'BEGIN {total = 0} $4 ~ /20090405/ { total+=$3 }END {print "Total:" total}'


の同等が

> ```powershell
cat .\test.csv | ?{ $_.Split(",")[3] -match "20090405" } | %{$total=0}{ $total += $_.Split(",")[2]}{$total}

で、後者のほうが思考の流れにそってパイプラインの左から右へ処理をつなげていけてよいとのことです。でも、それなら AWK のほうでも

cat test.csv | awk -F, '$4 ~ /20090405/' | awk -F, 'BEGIN {total = 0} { total+=$3 }END {print "Total:" total}'

とかじゃだめなんですか、とおもってしまいます。

あと AWK でパターン・アクションを複数かいたとき、たとえば

cat test.csv | awk -F, '
    BEGIN { total1 = total2 = 0 }
    $4 ~ /20090405/ { total1 += $3 }
    $NF ~ /New-Opportunity/ { total2 += $3 }
    END { print "Total1:", total1, "Total2:", total2 }'

の PowerShell 同等には ? { ... } はつかえず結局

cat test.csv | % { $total1 = $total2 = 0 } {
    if ($_.Split(',')[3] -match '20090405') { $total1 += $_.Split(',')[2] }
    if ($_.Split(',')[-1] -match 'New-Opportunity') { $total2 += $_.Split(',')[2] }
} { "Total1: $total1 Total2: $total2" }

みたいなことになってしまうんではないかと…。

そういうわけで、とてもおもしろいとおもいつつもじつはこの記事の主張が本当のところはわかってません。しかし、わかっていないのはわたしがまだ PowerShell をまったくわかっていないからで、この記事の趣旨が「あー、そういうことだったのか」とわかるようになることを期待しつつ学習をつづけていきたいとおもいます。

Switch 文について (2020/1/4 加筆)

switch 文に AWK でパターン・アクションを複数かいたとき相当の機能があることをいまごろしりました。

cat test.csv | % { $total1 = $total2 = 0 } {
    switch (,$_.split(',')) {
        { $_[3] -match '20090405' } { $total1 += $_[2] }
        { $_[-1] -match 'New-Opportunity' } { $total2 += $_[2] }
    }
} { "Total1: $total1 Total2: $total2" }

最初の $_ はパイプをながれてきたブツですが、それ以外の $_switch 文のもの、ここでは $_.split(',') (文字列の配列) です。switch は配列を要素ごとに foreach みたくします3。そこで , 4をつけてもとの配列を要素とする要素数 1 の配列をつくってもとの配列がまるっと $_ にわたされるようにしています。

ちなみに以下の記事がすばらしいです。

  1. 実務でもすこしスクリプトをくませてもらったりして 2020 年になった現在ではいちおう初心者をなのれる程度にはなりました。

  2. もっとも、これはこの記事自体の問題点ではありませんけど。

  3. About Switch

  4. Comma operator

  5. 最初のサンプル プログラムをコピペして実行するとエラーになります。なんと 43 行目の if の条件式がわたしのような初心者がやらかしがちな…。でもこの記事はほんといいです。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?