0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Powershellで直前の処理の成否をわかりやすくしよう+α

Posted at

はじめに

 こんにちは、麻菜結と申します。Windowsで開発を始めた方はそろそろコマンドプロンプトを見放し始めているころだと思いますが、Powershellはプロンプトの文字列を簡単に操作できるのはご存じですか?今回は、普段自分が使用しているPowershellのPromptの設定をお見せしようと思います。

環境

 環境はPS7です。

> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.0.0
PSEdition                      Core
GitCommitId                    7.0.0
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

 文字の表示の色をいじるのでWrite-Hostが機能するターミナルでやりましょう。
Colore_Check.png

こんなかんじです

 以下のPrompt関数を$Profileに追記すると

function Prompt {
    $result = $?
    $here = Convert-Path .
    $rand = Get-Random 4
    $good_words = @("..", "ok", "sure", "well")
    $bad_words = @("..", "bad", "what?", "idk")
    Write-Host "[${env:username}]${here}" -NoNewLine
    if ($result) {
        Write-Host " (PS'-')$($good_words[$rand])" -NoNewLine -ForegroundColor "Green"
    } else {
        Write-Host " (PS'-')$($bad_words[$rand])" -NoNewLine -ForegroundColor "Red"
    }
    return "`n> "
}

 こんなかんじになります。
good.png
bad.png

 右の不愛想なキャラが前の処理の成否を教えてくれるわけですね。ここからはそれぞれの部分の解説です。

前の処理の結果を取得する

 以下の変数から取得できます。Prompt関数内で一度変数に入れているのは、Prompt内の処理で$?の値が書き換わってしまうからです。

> $?
True

カレントディレクトリのパスを取得する

 おそらくこの、Convert-Pathから相対パス.をフルパスに変換してしまうのが一番簡単だと思います。

> Convert-Path .
C:\

キャラに喋らせたい

 これは別になくてもいいのですが、かわいいのでやります。成功したときの言葉と失敗したときの言葉それぞれを用意して、キャラの後ろにくっつけます。

$rand = Get-Random 4
$good_words = @("..", "ok", "sure", "well")
$bad_words = @("..", "bad", "what?", "idk")

ユーザーネームを取得する

 完全にBashの影響な気がしますが、なんとなく落ち着くのでつけておきます。

> $env:username

What is return "`n> "?

 Prompt関数は返り値として文字列を期待されているのでつけます。Powershellでは改行文字は\nではなく`nなので、マークダウンで入力しづらいなこれも好みですが、入力プロンプトは改行されてた方が読みやすくて良くないですか?さっきまでの-NoNewLineで出力されていた文字列から改行をかけて> を表示している感じですね。

return "`n> "

結局どこに書き込めばいいんだっけ?

 さらっと流してしまったので念のため。$Profile変数には今使っているPowershellのプロファイルのパスが入っています。Bashの.bashrcみたいなものですね。ここに書き込まれた関数、エイリアス、コマンドレット、変数はあらかじめ実行・定義された状態で始まります。

> $Profile
# C:\Usersからはじまり.ps1で終わる何らかのファイルのパス

おわりに

 お疲れさまでした。上手く実行できましたか?Write-Hostが非推奨になっているっぽいし、色々な環境でテストしていないので若干不安です。それでも、何らかのお役に立てたら幸いです。ここまで読んでくださってありがとうございます。
 次何書こうかな、長編というかいくつかに分けて書きたいネタがあるのでそれ書くかも。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?