「 Linux ならできるのに、だから Windows は...」「それ PowerShell でできるよ」

  • 852
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Summary

普段使い用 PowerShell メモ

思惑

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

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

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

grep

それ Select-String でできるよ

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

find -name hogehoge

それ(以下略

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

cat

Get-Content .\foo.txt

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

sort, uniq

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

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

wc -l

$(cat .\test.txt).Length

diff

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

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

sed

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

tail

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

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

wget

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

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

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

curl

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

unzip

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

xargs

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

man

man Foo-Bar

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

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

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

応答なし

kill -name iexplore

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

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

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

タイマー

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

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

PowerShell as a "電卓"

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

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

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

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 みたいにして読み込んで使う。

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

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

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

jq

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

PowerShell で JSON をファイル入出力 する - tech.guitarrapc.cóm

eject

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

(☝ ՞ਊ ՞)☝ウイーン

おわりに

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

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

see also