媽媽,為什麼我的 powershell 和別人不一樣?!

大家眼裡 powershell 大概是長成什麼樣子的:

這樣?

還是這樣?

基本上都是這樣的吧。

-----------------------------------------------------------------------------------

可是你見過這樣的 powershell 么:

這樣的:

甚至於,這樣的:

相信大家都見過 oh-my-zsh 上面各種各樣炫酷的 theme,很是喜歡,(如果沒見過看這裡:github.com/robbyrussell)其實上面大部分的 theme 都可以用很簡單易懂的 powershell configuration 來實現。

---------------------------------------------------------------------------------

至於什麼叫簡單易懂。。。我們來做個對比,我的 theme 時上面的第一個,仿照 zsh 的 ys theme 做的:

那我們就來對比一下代碼。

這是我的 theme 配置的代碼:

function prompt {n n $path = Split-Path -leaf -path (Get-Location)n $Date = Get-Daten n Write-Hostn Write-Host "# " -NoNewline -ForegroundColor Bluen Write-Host $env:USERNAME -NoNewline -ForegroundColor Cyann Write-Host " in " -NoNewlinen Write-Host $path" " -NoNewline -ForegroundColor Greenn $realLASTEXITCODE = $LASTEXITCODEn Write-VcsStatusn $global:LASTEXITCODE = $realLASTEXITCODEn Write-Host " "$Date n Write-Host ">" -NoNewline -ForegroundColor Magentan n return " " n}n

這是 ys 的配置代碼:

# VCSnYS_VCS_PROMPT_PREFIX1=" %{$fg[white]%}on%{$reset_color%} "nYS_VCS_PROMPT_PREFIX2=":%{$fg[cyan]%}"nYS_VCS_PROMPT_SUFFIX="%{$reset_color%}"nYS_VCS_PROMPT_DIRTY=" %{$fg[red]%}x"nYS_VCS_PROMPT_CLEAN=" %{$fg[green]%}o"nn# Git infonlocal git_info=$(git_prompt_info)nZSH_THEME_GIT_PROMPT_PREFIX="${YS_VCS_PROMPT_PREFIX1}git${YS_VCS_PROMPT_PREFIX2}"nZSH_THEME_GIT_PROMPT_SUFFIX="$YS_VCS_PROMPT_SUFFIX"nZSH_THEME_GIT_PROMPT_DIRTY="$YS_VCS_PROMPT_DIRTY"nZSH_THEME_GIT_PROMPT_CLEAN="$YS_VCS_PROMPT_CLEAN"nn# HG infonlocal hg_info=$(ys_hg_prompt_info)nys_hg_prompt_info() {nt# make sure this is a hg dirntif [ -d .hg ]; thennttecho -n "${YS_VCS_PROMPT_PREFIX1}hg${YS_VCS_PROMPT_PREFIX2}"nttecho -n $(hg branch 2>/dev/null)nttif [ -n "$(hg status 2>/dev/null)" ]; thenntttecho -n "$YS_VCS_PROMPT_DIRTY"nttelsentttecho -n "$YS_VCS_PROMPT_CLEAN"nttfinttecho -n "$YS_VCS_PROMPT_SUFFIX"ntfin}nnlocal exit_code="%(?,,C:%{$fg[red]%}%?%{$reset_color%})"nn# Prompt format:n#n# PRIVILEGES USER @ MACHINE in DIRECTORY on git:BRANCH STATE [TIME] C:LAST_EXIT_CODEn# $ COMMANDn#n# For example:n#n# % ys @ ys-mbp in ~/.oh-my-zsh on git:master x [21:47:42] C:0n# $nPROMPT="n%{$terminfo[bold]$fg[blue]%}#%{$reset_color%} n%(#,%{$bg[yellow]%}%{$fg[black]%}%n%{$reset_color%},%{$fg[cyan]%}%n) n%{$fg[white]%}@ n%{$fg[green]%}%m n%{$fg[white]%}in n%{$terminfo[bold]$fg[yellow]%}%~%{$reset_color%}n${hg_info}n${git_info}n n%{$fg[white]%}[%*] $exit_coden%{$terminfo[bold]$fg[red]%}$ %{$reset_color%}"n

我覺得我已經表明 powershell 本身配置的易用性了。。。

--------------------------------------------------------------------------------------------------

接下來我們來說點正事,如何配置一個好的 powershell theme。

powershell 每次 pompt 的時候其實就是調用了一個 prompt 函數。你可以理解為如下代碼:

$promptStr = prompt # call the prompt functionnif ($promptStr) { # check if prompt returned anythingn echo $promptStr # echo is an alias for write-outputn}nelse { # if prompt function returns nothing,n echo "PS> " # use the default ugly promptn}n

所以這就很清楚了。我們如果需要做一個好看的 prompt,那麼我們需要規避兩個問題。

  1. 那個 Write-Output (或者是 echo,這種情況下和 Write-Host 是一樣的)是沒有顏色的。
  2. 千萬不要出現哪個噁心的 "PS> " 超難看的。。。

既然 prompt 函數 return 的東西是沒有顏色的,那麼我們就要在它調用 prompt 函數的時候來輸出一些有顏色的東西。

至於有顏色的東西怎麼寫,你可以吧下面這一段放到你的 prompt 函數裡面

Write-Host test -ForegroundColor Green n

因為 Write-Host 裡面是可以隨意設置顏色的,如果你希望輸出 "test $Date",讓 test 是綠色,$Date 是紅色,你可以寫如下的代碼

$Date = Get-DatenWrite-Host test -NoNewLine -ForegroundColor GreennWrite-Host $Date -ForegroundColor Redn

以上代碼會輸出如下結果:

很不錯吧!

好了,說完了如何輸出彩色的字,那我們如何避免哪個噁心的 "PS> " 呢?

很簡單,如果你不要求 prompt 的最後一個字元有顏色的話,直接 return 就好了,比如:

function prompt {n Write-host test prompt -NoNewLine -ForegroundColor Greenn return >n}n

但是,如果我想讓哪個 > 也有顏色怎麼辦呢?

function prompt {n Write-host test prompt -NoNewLine -ForegroundColor Greennn Write-host > -NoNewLine -ForegroundColor Redn return n}n

多簡單!

最後,如何顯示 git status 呢?我用的是 posh-git:github.com/dahlbyk/posh

裡面有一個 Write-VcsStatus 函數,可以顯示的很好。但是因為這個函數會使用 git,可能會產生一個 exit code,為了保證你的 $LastExitCode 正確,需要用這個 snippet:

$realLASTEXITCODE = $LASTEXITCODEnn Write-VcsStatusnn $global:LASTEXITCODE = $realLASTEXITCODEn

以上。

--------------------------------------------------------------------------------------

現在已經做了一個 powershell module 來管理 powershell theme。

d

推薦閱讀:

乾貨 || Windows Shellcode學習筆記——shellcode在棧溢出中的利用與優化
乾貨 || Windows Shellcode學習筆記——棧溢出中對jmp esp的利用與優化
AppDomainManager後門的實現思路
乾貨 | PowerShell技巧——藉助kd.exe隱藏進程

TAG:PowerShell | Windows10 |