🐕

PowerShellを使ってみた

2025/02/19に公開

はじめに

みなさんはシェルスクリプトは好きでしょうか?
手軽に色々な作業を自動化してくれるので手放せませんよね。
Web系の作業者やMacユーザなら大抵Linux系のシェルを使うと思いますが、windowsの操作はLinuxやUnix系ほど使わないのではないでしょうか。

以前ならMS-DOS系のコマンドが主流で、今でもbatファイルは現役なのですが、PowerShellの採用も増えてきていると思います。

私は最近PowerShellを触りだしたのですが、結構実用で使っていますので、入門記事を書いてみることにしました。

起動のやり方

まず、ファイル名について。
PowerShellの拡張子は「.ps1」(ぴー えす いち)にしなければいけません。
私ははじめMS-DOSと同じ「.bat」だと思ってハマりました。
さらに調べていて数字の1かエルの小文字か分かりにくかったです。数字が正解。
注意してください。

というわけで、ワークスペース直下に「lesson.ps1」というファイルを作って、以下の内容を記述します。

lesson.ps1
Write-Output "Lesson Start"

これはプログラミング言語のprint関数とかecho関数みたいなものでコンソール画面に文字列を出力します。

ターミナルを開いて「.\lesson」と入力してエンターを押すと実行できます。
以下のようになればOK。

❯ .\lesson
Lesson Start

ハマりポイントとして、「./lesson」のようにスラッシュではなく、バックスラッシュになっている点です。bashスクリプトになれているとハマリます。

コマンドライン引数を使う

今度は引数を与えて分岐させてみます。

lesson.ps1
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

args[0] に1つめの引数が入っています。args[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スキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion