媽媽,為什麼我的 powershell 和別人不一樣?!
大家眼裡 powershell 大概是長成什麼樣子的:
這樣?
還是這樣?基本上都是這樣的吧。
-----------------------------------------------------------------------------------
可是你見過這樣的 powershell 么:
這樣的:
甚至於,這樣的:
相信大家都見過 oh-my-zsh 上面各種各樣炫酷的 theme,很是喜歡,(如果沒見過看這裡:https://github.com/robbyrussell/oh-my-zsh/wiki/themes)其實上面大部分的 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,那麼我們需要規避兩個問題。
- 那個 Write-Output (或者是 echo,這種情況下和 Write-Host 是一樣的)是沒有顏色的。
- 千萬不要出現哪個噁心的 "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:https://github.com/dahlbyk/posh-git
裡面有一個 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 |