PowerShellを使ってみた
はじめに
みなさんはシェルスクリプトは好きでしょうか?
手軽に色々な作業を自動化してくれるので手放せませんよね。
Web系の作業者やMacユーザなら大抵Linux系のシェルを使うと思いますが、windowsの操作はLinuxやUnix系ほど使わないのではないでしょうか。
以前ならMS-DOS系のコマンドが主流で、今でもbatファイルは現役なのですが、PowerShellの採用も増えてきていると思います。
私は最近PowerShellを触りだしたのですが、結構実用で使っていますので、入門記事を書いてみることにしました。
起動のやり方
まず、ファイル名について。
PowerShellの拡張子は「.ps1」(ぴー えす いち)にしなければいけません。
私ははじめMS-DOSと同じ「.bat」だと思ってハマりました。
さらに調べていて数字の1かエルの小文字か分かりにくかったです。数字が正解。
注意してください。
というわけで、ワークスペース直下に「lesson.ps1」というファイルを作って、以下の内容を記述します。
Write-Output "Lesson Start"
これはプログラミング言語のprint関数とかecho関数みたいなものでコンソール画面に文字列を出力します。
ターミナルを開いて「.\lesson」と入力してエンターを押すと実行できます。
以下のようになればOK。
❯ .\lesson
Lesson Start
ハマりポイントとして、「./lesson」のようにスラッシュではなく、バックスラッシュになっている点です。bashスクリプトになれているとハマリます。
コマンドライン引数を使う
今度は引数を与えて分岐させてみます。
Write-Output "Lesson Start"
if ($args[0] -eq 1) {
Write-Output "input is 1"
} else {
Write-Output "input is not 1"
}
引数に1を渡した場合と1以外を渡した場合に分岐することを確認します。
❯ .\lesson 1
Lesson Start
input is 1
❯ .\lesson 2
Lesson Start
input is not 1
bashスクリプトに慣れている方はif文の書き方がC系言語のように直感的でわかりやすいことがわかると思います。
実践の例
以下は実際に私が使っているスクリプトを元にした例です。
Set-LocationでLinuxのcdコマンドと同様のことができます。
docker-compose downなどのコマンドはそのまま使えました。
try-catch-finallyも直感的に記述できていますね。
[Console]::OutputEncoding = [Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# 現在のディレクトリを保存
$originalLocation = Get-Location
try {
if ([string]::IsNullOrEmpty($args[0]) -or $args[0] -eq 1) {
Write-Output "### [Start] Docker ###"
Set-Location "backend_dir"
Write-Output "### Docker Down ###"
docker-compose down
Write-Output "### Docker Up ###"
docker-compose up -d
Write-Output "### Docker Migrate ###"
docker-compose exec php composer migrate
Set-Location $originalLocation
}
if ([string]::IsNullOrEmpty($args[0]) -or $args[0] -eq 2) {
Set-Location "frontend_dir"
# 指定ポートを使用しているプロセスを特定
$port = 5173
$processId = netstat -ano | Select-String ":$port" | ForEach-Object { ($_ -split '\s+')[-1] }
# プロセスが見つかった場合、終了させる
Write-Output "### [Check Using Port] Vite ###"
if ($processId) {
Stop-Process -Id $processId -Force
Write-Host "### [Stop Using Port] $port "
} else {
Write-Host "### [Not Found Using Port] $port "
}
Write-Output "### [Start] Vite ###"
./node_modules/.bin/vite dev
}
}
finally {
# 処理が終わった後、元のディレクトリに戻る
Set-Location $originalLocation
}
(補足)コマンドの命名規則
PowerShellでは「動詞-名詞」の形になるという法則があります。
動詞部分はコマンドの動作(アクション)を表します。
例:
Get(取得する)
Set(設定する)
New(新規作成する)
Remove(削除する)
Start(開始する)
Stop(停止する)
Invoke(実行する)
Export(エクスポートする)
名詞部分は操作対象(オブジェクト)を表します。
Process(プロセス)
Service(サービス)
Item(ファイルやフォルダなどの項目)
Computer(コンピューター)
EventLog(イベントログ)
おわりに
いかがだったでしょうか?
PowerShellについてはまだ書籍もほとんどなく、情報も少ないですが、Windowsで開発する以上はずっとLinuxに頼るより親和性がいいと思いますので、少しづつ覚えていきたいですね。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion