IPFactory Advent Calender 2019 21日目
IPFactory3年の @smicle です。
Advent Calenderは今年が初参加になります。
何卒よろしくお願いいたします。
目次
PowerShellでもaliasとか設定したくないですか?
というか設定しないとまともに作業できない…
PowerShellの.bashrcことprofileを設定しましょう!
詳細:Windows PowerShell Profiles
PowerShellScriptを実行する権限を付与
初期状態だとprofileを設定してもscriptを実行する権限がないので、適切な権限を付与しましょう。
色々ありますけど管理者権限で以下のコマンドを実行すれば大丈夫です。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
profileの場所
profileの場所一覧
- $Profile.AllUsersAllHosts
- %windir%\system32\WindowsPowerShell\v1.0\profile.ps1
- $Profile.AllUsersCurrentHost
- %windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
- $Profile.CurrentUserAllHosts
- %UserProfile%\My Documents\WindowsPowerShell\profile.ps1
- $Profile.CurrentUserCurrentHost
- %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
以下のコマンドで場所が確認できます。
表示されたPathの場所にファイルを作成し編集します。
echo $Profile.AllUsersAllHosts
echo $Profile.AllUsersCurrentHost
echo $Profile.CurrentUserAllHosts
echo $Profile.CurrentUserCurrentHost
CurrentUserの方が影響範囲が狭いので良いと思うのですが、自分はDocuments\WindowsPowerShell
を作りたくないのでAllUsersの方に作っています。
profileからScriptを読み込む
直接profileに色々書き込むと場所が指定されてしまったり、管理者権限が必要など不都合が多いので、別ファイルを読み込むようにすると楽です。(しなくても良い)
単一ファイルの場合
$script = "$Home\profile.ps1"
if (Test-Path $script) {
. $script
}
複数ファイルの場合
$script = @("$Home\profile.ps1", "$Home\function.ps1")
foreach ($s in $script) {
if (Test-Path $s) {
. $s
}
}
aliasの設定
ようやくaliasの設定に入れます…
PowerShellにはtouch
がないので設定してみます。(何故ない?)
Set-Alias -Name touch -Value New-Item
# 短縮した方が見やすい
Set-Alias touch New-Item
git
をg
にするならこれ
Set-Alias g git
以上です。
詳細:Set-Alias
ですがこのaliasには一つ問題があります。
引数込みの設定ができない点!
alias ..='cd ..'
みたいなことがPowerShellのaliasではできません。
でもご安心下さい!functionを使えば同じような事ができます。
functionの設定
ということでfunctionの設定です。
さっそく..
を設定してみます。
function ..() {
cd ../
}
# 1行でも良い
function ..() {cd ../}
以上です。
詳細:about_Functions
オススメの設定
エクスプローラーがカレントディレクトリで開きます。
function el() {explorer .}
カレントディレクトリのpathをクリップボードにコピーします。
function pwdc() {Set-Clipboard "$pwd"}
ディレクトリを作成したときの結果出力を非表示にします。(touchでも使える)
function mkd() {mkdir $args | Out-Null}
alias rm="rm -rf"を定義する
自分は過激派なのでrm
をrm -rf
に上書きしています。
さっそくやっていきましょう!
PowerShellは普通にrm -rf
と入力しても動きません。
そもそもPowerShellのrm
はただaliasです。
試しに以下のコマンドを打ってみて下さい。
Get-Alias | ? {$_.Name -eq "rm"}
このようなメッセージが出たと思います。
CommandType Name Version Source
----------- ---- ------- ------
Alias rm -> Remove-Item
rm
はRemove-Item
のaliasです。
cd
はSet-Location
、ls
はGet-ChildItem
と一般的に使いそうなaliasが元から掛かっています。(何故touch
がない?)
PowerShellのrm
は、皆さんの知っているrm
に似てるようで違います。
Remove-Itemのドキュメントを見れば分かるはずです。
-r
は-Recurse
、-f
は-Force
が同様の機能みたいなので
rm -Recurse -Force
とやればrm -rf
と同じ事ができます!
以下の関数を登録すれば完了です。
function rm() {Remove-Item -Recurse -Force $args}
実際に動作確認をしてみます。
rm .\test\
確認
C:\Users\smicle\test\ の項目には子があり、Recurse パラメーターが指定されていませんでした。続行した場合、項目と共にすべての子が削除されます。続行します
か?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"):
Recurse
は設定されているはずだが?
コマンドには優先順位が存在します。
コマンドの優先順位
- Alias
- Function
- Cmdlet
- Native Windows commands
なのでrm
のaliasを削除しなければなりません。
aliasの削除にもremove-item
を使います。
remove-item alias:rm -Force
これでrm
がrm -rf
で動くようになります!
なのでprofileには以下のコードを追加すればOKです。
remove-item alias:rm -Force
function rm() {Remove-Item -Recurse -Force $args}
わざわざrm
を上書きする必要はないですが、PowerShellでrm -rf
するのは面倒くさいので、rmrf
とか登録しといた方が良いかも。
プロンプトをカラフルにする
白一色で見にくいのでカラフルにしたい!
PowerShellはprompt
の値を書き換える事で表示を変えられます。
以下のコードを追加すればプロンプトがカラフルになります!
function prompt {
Write-Host "$env:USERNAME " -ForegroundColor "Green" -NoNewline
Write-Host "$pwd " -ForegroundColor Magenta -NoNewline
Write-Host "$" -ForegroundColor "Green" -NoNewline
return " "
}
-NoNewline
を外せば2行とかにもできるので、自分好みのプロンプトに変更しましょう。
ちなみに管理者権限か判断する場合、以下のコードで確認できます。
$isRoot = (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
自分は管理者権限なら赤色、一般権限なら緑色にしたいので以下のようにしています。
function prompt {
$isRoot = (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
$color = if ($isRoot) {"Red"} else {"Green"}
$marker = if ($isRoot) {"#"} else {"$"}
Write-Host "$env:USERNAME " -ForegroundColor $color -NoNewline
Write-Host "$pwd " -ForegroundColor Magenta -NoNewline
Write-Host $marker -ForegroundColor $color -NoNewline
return " "
}
キーボードバインド等を変更
以下の1行を追加するだけです。
Set-PSReadLineOption -EditMode Emacs -BellStyle None
-EditMode Emacs
は、Emacs
のキーバインドに変更します。
なので、Ctrl+u
でキャレットより前の文字を全部消したりなど、bash
と同じ感覚でショートカットが使えます。
-BellStyle None
は、バックスペース押し続けた際のビープ音が鳴らなくなります。
所感
PowerShellは普通に使える!
もちろんWSL使った方が良いときもありますが、基本的にPowerShellで問題なく作業できます。
想像以上に機能が多く紹介しきれていない事も沢山あるので、気になったらPowerShell ドキュメントを見てみて下さい。