開発者向け PowerShell 用に Linux 風プロファイルを作ってみた。


# プロジェクト名

Linux 風 PowerShell （パワーシェル）プロファイル

## 目的

著者はもともとLinuxかMacで開発勉強してたので、慣れない PowerShell のプロファイルを Linux 風にして使いやすくしました。

## 設定内容

ウィドウタイトルをカレントディレクトリを表示する。
プロンプトもカレントディレクトリのみを表示する。
git の状態をプロンプトに表示する。
git buranch 名をプロンプトに表示しる。
デフォルトでホームディレクトリから開始する。


```ps
[workspace] >
[codebase] (main) * > //コミット判定 False
[codebase] (main) > 　//コミット判定 Clean

```

## インストール
始める前に、既にプロファイルがある場合は、バックアップする事をお勧めします。
```ps
Copy-Item -Path $PROFILE -Destination "$PROFILE.bak"
```

1. PowerShell を開いて、次のコマンドでプロファイルの場所を表示します。
```ps
$PROFILE
```
2. プロファイルファイルのパスがかえされるので、エクスプローラで開きます。
3. プロファイルがない場合は次のコマンドをターミナルから実行して空のプロファイルを作成することができます。
```ps
if (!(Test-Path -Path $PROFILE)) {
    New-Item -Type File -Path $PROFILE -Force
}
```
4. 空のプロファイルを作成したら。または、既存のプロファイルを本リポジトリの `Microsoft.PowerShell_profile.ps1`と置き換えるか、用途に合わせて編集します。
```ps
"Microsoft.PowerShell_profile.ps1"
```
### ウィドウタイトルの変更 
```ps
# ターミナルのウィンドウタイトルをカレントディレクトリにする。
function Update-WindowTitle {
    $homeDirectory = [System.Environment]::GetFolderPath("UserProfile")
    $currentDirectory = Get-Location

    if ($currentDirectory -eq $homeDirectory) {
        $currentDirectory = "~"
    } elseif ($currentDirectory -eq "C:\") {
        $currentDirectory = "/"
    } else {
        $currentDirectory = Split-Path -Leaf $currentDirectory.Path
        if ($currentDirectory -eq "C:") {
            $currentDirectory = "/"
        } else {
            $currentDirectory = "$currentDirectory"
        }
    }

    $title = "[$currentDirectory]"
    $host.UI.RawUI.WindowTitle = $title
}
```
### Git リポジトリの判定
```ps
# Git リポジトリの状態を判別。
function Test-GitRepository {
    try {
        git rev-parse --is-inside-work-tree 2>$null
        if ($?) {
            return $true
        } else {
            return $false
        }
    } catch {
        return $false
    }
}

```
### Git ブランチの判定
```ps
# Git ブランチの状態を判定する
function Get-GitBranch {
    if (-not (Test-GitRepository)) {
        return $false
    }

    try {
        $branch = git rev-parse --abbrev-ref HEAD 2>$null
        if ($branch) {
            return $branch
        }
    } catch {
        return $false
    }
    return $false
}
```
### Git コミット状況の判定
```ps
# コミット判定
function Get-GitStatus {
    if (-not (Test-GitRepository)) {
        return $false
    }

    try {
        $status = git status --porcelain 2>$null
        if ($status) {
            return "Dirty"
        } else {
            return "Clean"
        }
    } catch {
        return $false
    }
}
```
### 集積した内容の反映
```ps
# カレントディレクトリが変更されるたびにウィンドウタイトルを更新し、プロンプトを設定する
function Set-Prompt {
    Update-WindowTitle
    $currentDirectory = Get-Location

    $branchName = if (Test-GitRepository) {
        $branch = Get-GitBranch
        if ($branch -ne $false) {
            " ($branch)"
        } else {
            ""
        }
    } else {
        ""
    }

    $gitStatus = if (Test-GitRepository) {
        $status = Get-GitStatus
        if ($status -eq "Dirty") {
            " *"
        } elseif ($status -eq "Clean") {
            ""
        } else {
            ""
        }
    } else {
        ""
    }

    if ($currentDirectory -eq [System.Environment]::GetFolderPath("UserProfile")) {
        $currentDirectory = "~"
    } else {
        $currentDirectory = Split-Path -Leaf $currentDirectory.Path
    }

    # # デバッグ出力
    # Write-Host "Debug: Current Directory = $currentDirectory"
    # Write-Host "Debug: Branch Name = $branchName"
    # Write-Host "Debug: Git Status = $gitStatus"

    "[$currentDirectory]$branchName$gitStatus > "
}
```
```ps

# プロンプト関数を変更
function prompt {
    Set-Prompt
}

# 初回実行
Update-WindowTitle

# PowerShell起動時にホームディレクトリに移動
Set-Location ([System.Environment]::GetFolderPath("UserProfile"))
```

5. 変更内容は、ターミナルを再起動するか次のコマンドを実行して反映できます。
```shell
. $PROFILE
```

以上

## ライセンス

このプロジェクトは [MIT](https://opensource.org/licenses/MIT) のもとで公開されています。詳細は [LICENSE.txt](LICENSE.txt) を参照してください。

### リコール

完成後の状態。

![Screenshot_2024-07-29_172326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794282/c3648fb6-afe3-85b5-a8f5-ac0aa59a9843.png)

### メモ
- PowerShell スクリプトは下記のサイトで紹介されています。
マイクロソフト本家は管理者向けで、ドスパラさんで紹介されている内容の方が初見の方向けって感じです。
    
    [スクリプトについて - PowerShell](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scripts?view=powershell-7.4)
    
    [PowerShell（パワーシェル）のコマンドレットやスクリプトの作成方法と実行までを解説！｜ドスパラ通販【公式】](https://www.dospara.co.jp/5info/cts_str_pcuse_powershelluse.html)
    
- 著者はそんなにPowerShellスクリプトに詳しい訳ではないので、AI と一緒に共同作業しました。
- 著者の AI くんはバグった時の原因切り分けとかが 苦手なので、主にデバッグで エラー が出た時に切り分け手順の作成と要件定義を担当しました。

<aside>
📌 まとめ：コードとドキュメントは https://github.com/meiob/psscdev に公開してあります。参考にしたい方は、どうぞ。

</aside>

---