それ PowerShell でできるよ

# Summary

普段使い用 PowerShell メモ


# 思惑

個人的には、 PowerShell はスクリプトをゴリゴリ書くよりも、
ちょこちょこ作業するのに向いていると思っている。
ただ、しばらく使っていないと忘れたりするので、そういうものをまとめてみる。
Linux で、grep とか使って、よくやりそうな感じのやつ。

共用パソコンなどの自分の環境以外でも使えることを想定しているので、
できるだけデフォルトの状態で、できるものに限定する。

また、普段使い想定なので、タイプ数を減らすのを優先していたりするので、
PowerShell の文法的には微妙なところも多少ある。


# grep

それ `Select-String` でできるよ

```ps1
Select-String -Path .\foo.txt -Pattern "bar"
```

# find -name hogehoge

それ（以下略

```ps1
ls -r | where { $_.Name -match "hogehoge" }
```

# cat

```ps1
Get-Content .\foo.txt
```

最初から `cat` がエイリアスに設定されてるはずなので、 `cat` でも可


# sort, uniq

```ps1
Get-Content .\test.txt | Sort-Object | Get-Unique

# デフォルトのエイリアスを使って、↓みたいにも可能
cat .\test.txt | sort | uniq
```

# wc -l

```ps1
$(cat .\test.txt).Length
```


# diff

```ps1
Compare-Object $(cat .\a.txt) $(cat .\b.txt)
```

ただし、表示形式は微妙。 unified で見たい・・・


# sed

```ps1
Get-Content .\foo.txt | % { $_ -replace "posh","PowerShell" }
```

# tail

```ps1
# PowerShell 2.0
Get-Content .\error.log -Wait

# PowerShell 3.0+
Get-Content .\error.log -Wait -Tail 5
```

# wget

```ps1
(new-object net.webclient).DownloadFile("URL", "保存先の絶対パス")
```

新しめの PowerShell だと ↓ みたいにも可能

```ps1
Invoke-WebRequest http://files.kaoriya.net/goto/vim74w64 -OutFile .\vim.zip
```

# curl

```ps1
Invoke-RestMethod -Uri "http://localhost:1234/poshcomplete/" -Method POST -Body "text=test"
```

# unzip

```ps1
# .NET 4.5+
# 末尾のセミコロンが無いと表示されないので付けています．付けていてもコードとしては動きます（どうみてもバッドノウハウｗ
[System.IO.Compression.Zipfile]::ExtractToDirectory("圧縮ファイルの絶対パス", "解凍先の絶対パス");
```

# xargs

```ps1
ls .\ | % { cat $_.FullName }
```

# man

```ps1
man Foo-Bar
```

# その他便利そうなものを少し

## なんとなくループ回したいときとか

```ps1
"PS", "posh", "PowerShell" | % { echo $_ }
0..255 | % { echo $_ }
cat .\filepathlist.txt | % { cat $_ } # テキストファイルの中身を 1 行ずつループで回す
```

## 応答なし

```ps1
kill -name iexplore
```

## 最終更新日時とかで絞り込みたいとき

```ps1
# 30日以内に更新した1KB以上のファイル一覧
ls | where { ($(Get-Date) - $_.LastWriteTime).Days -lt 30 } | where { $_.Length -gt 1KB }
```

where で絞り込めるので、ファイルサイズとかで絞り込んだりする。


## タイマー

```ps1
$n = 3
timeout $($n * 60); shutdown -h
```

n 分後にハイバネーション


## PowerShell as a "電卓"

```ps1
1 + 2 + [Math]::Pow(2, 10)
```

普通に演算子を使って、単純な計算をしたり、 `System.Math` を使って、いろいろしたり


## ディレクトリの中の合計サイズ調べるとき

``` ps1
gci .\ | where { $_.PSIsContainer } | % { Write-Host -NoNewline ($_.Name + "`t"); (gci $_.Name -Recurse | measure -Property Length -Sum).Sum; }
```


## .NET の確認

unzip とか、電卓の Math とかみたいに、.NET も呼べるので、ちょっとメソッド確認したいときとかに使える。
読み込まれていないものを使いたいときは、 `Add-Type -AssemblyName System.HogeHoge` みたいにして読み込んで使う。

## 履歴からスクリプトを作る元を出力する

インタラクティブに実行していって、それを出力して編集してスクリプト作る

```ps1
Get-History | % { Out-File -InputObject $_.CommandLine -Encoding default -Append ~/foobar.ps1 }
```

## jq

jq みたいなことできるコマンドも、比較的新しいバージョンならできる。
オブジェクトで返ってくるので便利。
csv とかも、オブジェクトで返ってくるコマンドレットがあるので便利。
説明が面倒なので、下記のリンク先を見るとか、ググるとかしてください。

[PowerShell で JSON をファイル入出力 する - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/08/10/220803)

## eject

```ps1
(New-Object -com WMPlayer.OCX.7).cdromCollection.Item(0).Eject()
```

(☝ ՞ਊ ՞)☝ウイーン


# おわりに

ここまで書いて気がついたけど、オライリーのクックブックに、似たようなこと書いてた（分量が全然違うけど
他にも、見なおしてみたら、役に立ちそうなこと書いてあったから、再読するべき。

この手のシェルを使って仕事するのと、マウスでクリッククリックしまくって手作業で仕事を処理するのとでは、
効率が全然違うので、面倒な仕事は、さっさと終わらせて、本質的な作業に時間を割けるようにしたいですね。


# see also

* [CD-ROMトレイを取り出せるPowerShell関数、「Dismount-CDDrive」作った - PowerShell Scripting Weblog](http://winscript.jp/powershell/258)
* [PowerShellでtail -fを再現する - tech.guitarrapc.com](http://tech.guitarrapc.com/entry/2013/04/15/220408)