📝

PowerShell の環境を今風にお手軽改造する

2021/09/22に公開1

実は、そこまでお手軽でもない。しかしながら他で頑張るよりはお手軽だと思う。

PowerShell って使ってる?

私は使ってる。PowerShell といっても若干の違いがあり、PS 5系(powershell で走る奴)と PS 6/7/PS Core系(pwsh で走る奴)があって、今回話すのは pwsh のほう。bash とか fish みたいな要領で小気味よく起動できるので気に入っている。

さて、PowerShell はデフォルトではあんまり楽しくない見た目になっているし、pwsh を直で動かすのもなんだか……ねえ? ということで、以下のような作業をして環境をマシにする。

  • Windows Terminal を使う
  • パッケージマネージャを導入する(今回は scoop)
  • .bashrc めいたものを PowerShell でもやる

ここではどうにかして PowerShell 7 系を導入したこととする。

最終的には以下のようになる(カラーテーマとかにもよるけど)。

screenshot

Windows Terminal を使う

Windows Terminal は MS 謹製の今風ターミナルである。タブ機能がありカラーテーマ機能がありキーバインドも組み替えられるなど中々便利な代物なので、これを使っちゃおう。実は Microsoft Store からそのまま導入できるので理由がなければそれでいいと思う。実は PowerShell 7 系も同左。

Windows Terminal をマウスでかちかちするのはあまり楽しくない。Win + R して wt でそのままターミナルが起動する。ターミナルの設定にもよるがデフォルトでは(入っていれば) PowerShell 7 が読み込まれる。WSL などを使っているなら Ubuntu などが新規タブのところに見えるかもしれない。

パッケージマネージャを使う

Scoop はいわゆるパッケージマネージャの一種であり、Windows/PowerShell 環境で動作する。導入が簡単で操作も容易い。導入は PowerShell(PS 5でもいい) を起動して次のコマンドラインで終了する。

iwr -useb get.scoop.sh | iex

標準では %USERPROFILE/scoop にインストールされるらしいが、予め SCOOP / SCOOP_GLOBAL 環境変数をいじってやればインストール先を変えられる。

この Scoop はとても楽しいので、直感的に動かせば直感的な挙動をする。

scoop bucket add extras # パッケージのリポジトリ的な
scoop install aria2     # パッケージのダウンロードを高速化する
scoop install gimp vlc  # GUI アプリケーションもあるしちゃんと動く
scoop uninstall vlc     # ばいばい VLC
scoop list              # インストールしたパッケージ一覧を出す

sudo パッケージなんかを入れて、sudo pwsh みたいに実行すると管理者権限な pwsh が走るので何かと便利だったりとか、そんな感じ。uutils 入れてエイリアスを頑張ると coreutils が Windows でも動くよ!!! ワオ!!!

自由ソフトウェアなアプリケーションなら大体導入できる(Gpg4Win など入れるとすっごい面倒くさい例外もある)ので積極的に使っていきたいところ。nodejsdenopython もある。GUIソフトウェアの興味深いところでは obs-studiomusescore もある。

.bashrc 的な奴を使う

Microsoft.PowerShell_profile.ps1 というのが長ったらしいものの .bashrc めいたものである。以下プロファイル。これの置き場所は Get-Item $PROFILEecho $PROFILE を PowerShell で実行すれば出てくるはずなのでそれを参考にする。

Bash でいう PROMPT は PS では function prompt で定義する。考え方としては、prompt でターミナルに出力された文字列がそのままプロンプト文字列になるイメージ。

以下サンプルコード。

function prompt {
  $date = Get-Date -Format "HH:mm:ss"  # 日付
  $path = Split-Path -Path $pwd -Leaf  # カレントディレクトリ
  
  Write-Host $date -NoNewline
  Write-Host " "   -NoNewline
  Write-Host $path -NoNewline
  Write-Host " $"  -NoNewline
  
  return " " # これがないと出力がバグる、なんで???
  
  # 検証してないからわからないけど、多分
  # output: "11:22:33 Documents $ "
}

Write-Host は文字列を端末に書き込む奴で、-NoNewline をくっつけると改行しないで次の文字列を書き込める。これを利用すればプロンプトっぽい奴が得られる。Write-Host "..." -ForegroundColor blue みたいにすると色もつけられる。

参考までに、以下は現在のユーザ名と bash でいう #$ を算出するコードである。

# 現在のユーザ名
$user = [Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")[1]

# Administrator なら #、一般ユーザーなら $ 
$elevation = $(
  $IsAdmin = (
    New-Object Security.Principal.WindowsPrincipal (
      [Security.Principal.WindowsIdentity]::GetCurrent()
    )
  ).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
  
  if ($IsAdmin) {
    "#"
  }
  else {
    "$"
  }
)

Welcome to New Extreme

私の言いたいことが伝わってくれていれば、おそらく新しい極限に達しているものと思う。ところでリンク先の曲はこれを書いているときに聞いていた曲なので、よかったらどうぞ。

Windows Terminal は Hyper とか Termius とか似たようなものがあるし、Scoop も Chocolatey とか winget とかこれもまた似たようなものがある。何を取るかは人の好みの問題で、気にするべきは現代的なツールチェインを使って楽をしようってことだ。もっとも、ツールチェインの工作は苦労するのが常なのだが。

omake: winfetch

冒頭のスクリーンショットに出てきた出力は winfetch によるもので、いわゆる neofetch の Windows 版みたいなものである。なんと、Scoop のパッケージ導入数とかも出てきて面白い。今回のやり方の限りでは、scoop install winfetch ですぐ動かせる。scoop bucket add extras が予め必要なのでご注意。

Discussion

あかれぎあかれぎ

すべてがめんどくさくなり嫌になったので、Starship に移行したことを書いておきます。
いずれ Starship + PS の構成の話を書こうと思います。いつか。