PowerShellのhelp
PowerShellでhelp ls
とかman cd
とか打つとHelpが表示されます。
この表示にはmore
コマンド(Windowsの場合はC:\WINDOWS\system32\more.com
)が使われます。
しかし、more
は戻ったりできないのでより高機能なless
を使えるようにしたいと思います。
helpの表示の仕方
(Get-Command help).Definition
と打つことでhelpコマンドの定義が見られます。
PS C:\> (Get-Command help).Definition
<#
.FORWARDHELPTARGETNAME Get-Help
.FORWARDHELPCATEGORY Cmdlet
# >
[CmdletBinding(DefaultParameterSetName='AllUsersView', HelpUri='https://go.microsoft.com/fwlink/?LinkID=113316')]
param(
[Parameter(Position=0, ValueFromPipelineByPropertyName=$true)]
[string]
${Name},
[string]
${Path},
[ValidateSet('Alias','Cmdlet','Provider','General','FAQ','Glossary','HelpFile','ScriptCommand','Function','Filter','ExternalScript','All','DefaultHelp','Workflow','DscResource','Class','Configuration')]
[string[]]
${Category},
[string[]]
${Component},
[string[]]
${Functionality},
[string[]]
${Role},
[Parameter(ParameterSetName='DetailedView', Mandatory=$true)]
[switch]
${Detailed},
[Parameter(ParameterSetName='AllUsersView')]
[switch]
${Full},
[Parameter(ParameterSetName='Examples', Mandatory=$true)]
[switch]
${Examples},
[Parameter(ParameterSetName='Parameters', Mandatory=$true)]
[string]
${Parameter},
[Parameter(ParameterSetName='Online', Mandatory=$true)]
[switch]
${Online},
[Parameter(ParameterSetName='ShowWindow', Mandatory=$true)]
[switch]
${ShowWindow})
#Set the outputencoding to Console::OutputEncoding. More.com doesn't work well with Unicode.
$outputEncoding=[System.Console]::OutputEncoding
Get-Help @PSBoundParameters | more
ずらっと出てますが、Get-Help
コマンドの結果をmore
に渡していることがわかります。
moreの定義も見てみます。
PS C:\> (Get-Command more).Definition
param([string[]]$paths)
$OutputEncoding = [System.Console]::OutputEncoding
if($paths) {
foreach ($file in $paths)
{
Get-Content $file | more.com
}
} else { $input | more.com }
ifはパイプで渡されたか引数で渡されたかの違いなので実質はhelp関数内で直接more.com
をパイプに渡してるのてと同等の記述です。
PowerShell Core 6.0以降ではマルチプラットフォーム対応でもう少し記述が多いですが、おおよそ同じかと思います。
lessへの差し替え
とりあえずmore
コマンドを使うことはないと割り切ってmore関数を上書きしてしまうのが楽でしょう。
使うless
はgit bashのMinGWでもwslのものでも大丈夫です。
下記はwslを使っていますが、MinGWの場合はwsl less
の部分をless.exe
のフルパスにしたら動くはずです。
less
はUTF-8を受ける動作が規定なのでUTF-8で出力するようにします。
function less {
param([string[]]$paths)
$OutputEncoding = [System.Console]::OutputEncoding
if ($paths) {
foreach ($file in $paths) {
Get-Content $file | & wsl less
}
}
else { $input | & wsl less }
}
Set-Alias more less
[System.Console]::OutputEncoding = $OutputEncoding = [System.Text.UTF8Encoding]::new()
これを$PROFILE
に追記します。
すると、man ls
などでもlessが使えます。
他の箇所でもlessが使えるようになります。
man ls
ls | less
less $PROFILE