ByProduct - 副産物

IT FukuSanButsu Blog

社内インフラエンジニアの自宅からはじまるIT
自宅のPCに向き合いながら気づいたことや個人的な知見をまとめています


プロフィール
しらせ(HN)
とあるIT企業のインフラエンジニア。プライベートでは開発もちょっとやります。
※本ブログの内容はすべて個人の見解であり、所属する企業とは関連ありません。
2023/09/30 暫く更新停止中m
プロフィールを読む
カテゴリ別
内部リンク
相互リンク
Twitter
来訪
1087272 [合計]
420 [今日]
621 [昨日]
Powered by
Powered by AWS Cloud Computing

【備忘】PowerShellマジPowerShell(1)一般的な私の活用例

2022/04/15
2022/04/15

コーディング


お疲れ様です。
しらせです。

今日はWindowsユーザーであれば知らない人はいないシェル「Windows PowerShell」の話題です。

プライベートから仕事までちょっとした時にめちゃくちゃ便利です。

手作業ではできないような事でも軽くスクリプトを書くだけで効率的に結果を出すことができます。

もくじ

PowerShellとは?

説明するまでもありません。

Windowsボタンから「W」欄にあるこいつです。

起動するとこんな感じの青い色の画面が出ます。

こいつが最強です。

VisualStudio特にC#を使っている人はオブジェクトの操作に慣れているかと思います。

それと同じ感覚でかつ型なしでゴリゴリの処理が可能です。※実際には型自体は存在しています。

最近のPowerShell(v5)ではコマンド自体もbashと似たものが多く利用できるようになっていますので、Linuxユーザーの方でも比較的すぐ慣れると思います。

例えば以下のようなコマンドはPowerShellでも実行可能です。
cat,cp,curlなんかはよく使いますね。

PS C:\> alias

CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias asnp -> Add-PSSnapin
Alias cat -> Get-Content
Alias cd -> Set-Location
Alias CFS -> ConvertFrom-String 3.1.0.0 Microsoft.PowerShell.Utility
Alias chdir -> Set-Location
Alias clc -> Clear-Content
Alias clear -> Clear-Host
Alias clhy -> Clear-History
Alias cli -> Clear-Item
Alias clp -> Clear-ItemProperty
Alias cls -> Clear-Host
Alias clv -> Clear-Variable
Alias cnsn -> Connect-PSSession
Alias compare -> Compare-Object
Alias copy -> Copy-Item
Alias cp -> Copy-Item
Alias cpi -> Copy-Item
Alias cpp -> Copy-ItemProperty
Alias curl -> Invoke-WebRequest
Alias cvpa -> Convert-Path
Alias dbp -> Disable-PSBreakpoint
Alias del -> Remove-Item
Alias diff -> Compare-Object
Alias dir -> Get-ChildItem
~~以下略~~

どんな時に使うか?

個人的によく使うケースは、CSVファイルやリスト形式で保存された大量のデータを一気に処理したい場合です。

最近では点群データを処理することが多々あります。

大量の行数からなるリスト形式で保存されたデータを行単位で処理するようなケースでは特に最適です。

例えばですが、5,000,000行からなるx,y,z座標の行データについて、以下のような処理をしたい場合を考えます。

  • x,y,z座標をそれぞれ+100する。
  • 行末に「,stone」という文字を追加する。

ファイルの中身は以下のような形式です。

x,y,z
10,20,10
35,15,40
20,10,70
~~以下略~~

おそらくエクセルで頑張ろうとしても100万行を超えると途中で切れてしまいますよね。

高性能なエディタを使えば何とかなりそうですが。

PowerShellを使えば以下で済みます。

$list = Import-Csv .\list_file.cst
foreach($list_item in $list){
 $x = [int]$list_item.x + 100
 $y = [int]$list_item.y + 100
 $x = [int]$list_item.z + 100
 $result = "$x,$y,$x,stone"
 echo $result >> ".\result.txt"
}

時間は掛かりますが待つだけで正確です。

あとは通常の電卓としても使えます。

いちいち電卓アプリを起動しなくてもその場で計算ができてしまいます。

PS C:\> 365/7
52.1428571428571

PS C:\> [Math]::sqrt(12)
3.46410161513775

電卓アプリを起動するのも面倒な人にはおすすめです。

よく使うコマンドは?

PowerShellを使ってると手放せないコマンドが出てくると思います。

lsとかcdとか使わざるを得ないコマンド以外だと以下があります。

  • 処理系:foreach、for、if
  • 配列系:配列と連想配列 @()と@{}
  • データ:Import-csv、cat
  • 通信系:ping、test-netconnection、tracert
  • .Netアセンブリ:[Math]
  • 並び替え重複排除:sort、gu

特に頻繁に使うのが上2つ3つです。

処理系

行データを処理する際にはfor文を使うよりもforeachで回してしまった方が楽ですね。

catで読み込んだ内容は改行ごとに配列に格納され、foreach文でそのまま処理にぶちこめます。

$list = cat ".\list.txt"
for($i = 0 ; $i -lt 1000 ; $i++){
#何らかの処理
}

と、for文でカウンターを使って書くか。

$list = cat ".\list.txt"
foreach($list_item in $list){
#何らかの処理
}

と、foreach文で書くかの違いです。

更には、一度変数に全データを読み込むとメモリを大量に消費する点を嫌う場合は、読み込んだデータをそのままパイプで繋いで次のコマンドに渡すとメモリ消費を大幅に減らせます。

cat ".\list.txt" | %{ #何らかの処理 }

上記3つはすべて同じ処理ができます。

一番最後なんかは可読性も無いので現場では嫌われそうです。

%{} = foreach(){} と同じ意味です。

配列系

配列(Array)と、ハッシュテーブル(連想配列)も重宝します。

配列を使う場合は初期化時に以下を定義します。

$list = @()

ハッシュテーブルを使う場合は以下のように定義します。

$list = @{}

配列は事前に要素数を定義する必要はありません。

要素の追加も「 += 」で最後尾に追加されますし、途中の要素の更新も添え字「$list[0]」をつけるだけです。

$list = @()
$list +="hoge"
$list +="huga"

PS C:\> $list
hoge
huga

ハッシュテーブルはさらに柔軟です。

$list["hoge"] = 1
$list["huga"] = 1
$list["hoge"] += 1

PS C:\> $list

Name Value
---- -----
huga 1
hoge 2

いわゆる連想配列で操作ができますので、Key,Value形式で重複数のカウントなども可能です。

先日、熱海市の点群データを処理した後のデータはマインクラフトのfunctionで流す用にコマンドへ変換後で1GB超えの17,652,336行でした。

1,2時間掛かりますが便利ですね。

以上
おつかれさまでした。



View:3913 この記事をツイート!