UNIX系コマンドとPowerShellコマンドレット

macOSやLinuxなどUNIX系コマンドに馴れている場合、UNIX系コマンドに対応するコマンドレットを知る方法が手っ取り早い学習方法になるかもしれない。

PowerShell Coreのソースコードには次の対応データも掲載されており、最初にPowerShell Coreのコマンドがどういうものになっているのかを知るにはよい資料だろう。

UNIX系コマンド PowerShellコマンド PowerShellエイリアス
ls Get-ChildItem dir, gci
tree Get-ChildItem -Rescure dir
cd Set-Location cd
pwd Get-Location pwd, gl
clear Clear-Host clear
mkdir New-Item -ItemType Directory ni
touch New-Item -Path ni
cat Get-Content type, gc
cp Copy-Item copy, cpi
cp -r Copy-Item src dst -Recurse copy, cpi
mv Move-Item move, mi
rm Remove-Item del, erase, rd, ri
rm -r Remove-Item dir -Recurse del, erase, rd, ri
find . -name キー Get-ChildItem キー -Recurse dir, gci
grep -Rin キー —include=”*.拡張子” * Get-ChildItem -Recurse -Filter *拡張子 | Select-String -Pattern キー dir, gci, sls

PowerShell Coreはオープンソースソフトウェアでクロスプラットフォームなのだが、コマンドレッドや関数、エイリアス、アプリケーションは環境によってその数が異なるので、必ずしも同じものが実行できるとは限らない。

例えば、Windows 10で動作するPowerShell Coreには次のコマンドレットが存在する。

Windows 10 PowerShell Core 6.0.2コマンドレット一覧
Add-Content, Add-History, Add-Member, Add-Type, Clear-Content, Clear-History, Clear-Item, Clear-ItemProperty, Clear-Variable, Compare-Object, Connect-PSSession, Connect-WSMan, ConvertFrom-Csv, ConvertFrom-Json, ConvertFrom-SecureString, ConvertFrom-StringData, Convert-Path, ConvertTo-Csv, ConvertTo-Html, ConvertTo-Json, ConvertTo-SecureString, ConvertTo-Xml, Copy-Item, Copy-ItemProperty, Debug-Job, Debug-Process, Debug-Runspace, Disable-PSBreakpoint, Disable-PSRemoting, Disable-PSSessionConfiguration, Disable-RunspaceDebug, Disable-WSManCredSSP, Disconnect-PSSession, Disconnect-WSMan, Enable-PSBreakpoint, Enable-PSRemoting, Enable-PSSessionConfiguration, Enable-RunspaceDebug, Enable-WSManCredSSP, Enter-PSHostProcess, Enter-PSSession, Exit-PSHostProcess, Exit-PSSession, Export-Alias, Export-BinaryMiLog, Export-Clixml, Export-Csv, Export-FormatData, Export-ModuleMember, Export-PSSession, Find-Package, Find-PackageProvider, ForEach-Object, Format-Custom, Format-Hex, Format-List, Format-Table, Format-Wide, Get-Acl, Get-Alias, Get-AuthenticodeSignature, Get-ChildItem, Get-CimAssociatedInstance, Get-CimClass, Get-CimInstance, Get-CimSession, Get-CmsMessage, Get-Command, Get-ComputerInfo, Get-Content, Get-Credential, Get-Culture, Get-Date, Get-Event, Get-EventSubscriber, Get-ExecutionPolicy, Get-FileHash, Get-FormatData, Get-Help, Get-History, Get-Host, Get-Item, Get-ItemProperty, Get-ItemPropertyValue, Get-Job, Get-Location, Get-Member, Get-Module, Get-Package, Get-PackageProvider, Get-PackageSource, Get-PfxCertificate, Get-Process, Get-PSBreakpoint, Get-PSCallStack, Get-PSDrive, Get-PSHostProcessInfo, Get-PSProvider, Get-PSReadlineKeyHandler, Get-PSReadlineOption, Get-PSSession, Get-PSSessionCapability, Get-PSSessionConfiguration, Get-Random, Get-Runspace, Get-RunspaceDebug, Get-Service, Get-TimeZone, Get-TraceSource, Get-TypeData, Get-UICulture, Get-Unique, Get-Uptime, Get-Variable, Get-Verb, Get-WinEvent, Get-WSManCredSSP, Get-WSManInstance, Group-Object, Import-Alias, Import-BinaryMiLog, Import-Clixml, Import-Csv, Import-LocalizedData, Import-Module, Import-PackageProvider, Import-PowerShellDataFile, Import-PSSession, Install-Package, Install-PackageProvider, Invoke-CimMethod, Invoke-Command, Invoke-Expression, Invoke-History, Invoke-Item, Invoke-RestMethod, Invoke-WebRequest, Invoke-WSManAction, Join-Path, Measure-Command, Measure-Object, Move-Item, Move-ItemProperty, New-Alias, New-CimInstance, New-CimSession, New-CimSessionOption, New-Event, New-FileCatalog, New-Guid, New-Item, New-ItemProperty, New-Module, New-ModuleManifest, New-Object, New-PSDrive, New-PSRoleCapabilityFile, New-PSSession, New-PSSessionConfigurationFile, New-PSSessionOption, New-PSTransportOption, New-Service, New-TemporaryFile, New-TimeSpan, New-Variable, New-WinEvent, New-WSManInstance, New-WSManSessionOption, Out-Default, Out-File, Out-Host, Out-Null, Out-String, Pop-Location, Protect-CmsMessage, Push-Location, Read-Host, Receive-Job, Receive-PSSession, Register-ArgumentCompleter, Register-CimIndicationEvent, Register-EngineEvent, Register-ObjectEvent, Register-PackageSource, Register-PSSessionConfiguration, Remove-Alias, Remove-CimInstance, Remove-CimSession, Remove-Event, Remove-Item, Remove-ItemProperty, Remove-Job, Remove-Module, Remove-PSBreakpoint, Remove-PSDrive, Remove-PSReadlineKeyHandler, Remove-PSSession, Remove-Service, Remove-TypeData, Remove-Variable, Remove-WSManInstance, Rename-Computer, Rename-Item, Rename-ItemProperty, Resolve-Path, Restart-Computer, Restart-Service, Resume-Service, Save-Help, Save-Package, Select-Object, Select-String, Select-Xml, Send-MailMessage, Set-Acl, Set-Alias, Set-AuthenticodeSignature, Set-CimInstance, Set-Content, Set-Date, Set-ExecutionPolicy, Set-Item, Set-ItemProperty, Set-Location, Set-PackageSource, Set-PSBreakpoint, Set-PSDebug, Set-PSReadlineKeyHandler, Set-PSReadlineOption, Set-PSSessionConfiguration, Set-Service, Set-StrictMode, Set-TimeZone, Set-TraceSource, Set-Variable, Set-WSManInstance, Set-WSManQuickConfig, Sort-Object, Split-Path, Start-Job, Start-Process, Start-Service, Start-Sleep, Start-Transcript, Stop-Computer, Stop-Job, Stop-Process, Stop-Service, Stop-Transcript, Suspend-Service, Tee-Object, Test-FileCatalog, Test-ModuleManifest, Test-Path, Test-PSSessionConfigurationFile, Test-WSMan, Trace-Command, Unblock-File, Uninstall-Package, Unprotect-CmsMessage, Unregister-Event, Unregister-PackageSource, Unregister-PSSessionConfiguration, Update-FormatData, Update-Help, Update-TypeData, Wait-Debugger, Wait-Event, Wait-Job, Wait-Process, Where-Object, Write-Debug, Write-Error, Write-Host, Write-Information, Write-Output, Write-Progress, Write-Verbose, Write-Warning

PowerShell Coreのコマンドレットは命名規則が「動詞-名詞」のようになっており、名前からなんとなくどういった処理をするものかが想像できるようになっている。また、コマンドレットがどういった処理を行うものかは次のコマンドで調べることができる。

Get-Help コマンドレットや関数 -Online

上記コマンドを実行するとブラウザがオンラインマニュアルを表示する。Webブラウザから直接調べる場合には「PowerShell Module Browser」からコマンドレットやエイリアス名を入力して検索を実施すればよい。

よく使うコマンドレットとエイリアスを知ろう

PowerShellのすべてのコマンドレットとその使い方を覚えるのは不可能だ(それはUNIXコマンドも同じだけれども)。

覚えるにあたっては利用頻度が高いものを選ぶべきだが、その一つの指針としては、エイリアスの用意されているコマンドレットに注目するとよいだろう。短縮コマンド名が必要とされるほど、使用頻度の高いということである。

macOS High Sierraで動作しているPowerShell Core 6.0.2でエイリアスの設定されているコマンドレットを調べると次のようになる。

コマンドレット エイリアス
Where-Object ?
ForEach-Object %
Set-Location cd
Set-Location chdir
Clear-Content clc
Clear-Host clear
Clear-History clhy
Clear-Item cli
Clear-ItemProperty clp
Clear-Host cls
Clear-Variable clv
Copy-Item copy
Copy-Item cpi
Convert-Path cvpa
Disable-PSBreakpoint dbp
Remove-Item del
Get-ChildItem dir
Enable-PSBreakpoint ebp
Write-Output echo
Export-Alias epal
Export-Csv epcsv
Remove-Item erase
Enter-PSSession etsn
Exit-PSSession exsn
Format-Custom fc
Format-Hex fhx
Find-Module fimo
Format-List fl
ForEach-Object foreach
Format-Table ft
Format-Wide fw
Get-Alias gal
Get-PSBreakpoint gbp
Get-Content gc
Get-DSCConfiguration gcfg
Get-DscConfigurationStatus gcfgs
Get-ChildItem gci
Get-Command gcm
Get-PSCallStack gcs
Get-PSDrive gdr
Get-History ghy
Get-Item gi
Get-Job gjb
Get-Location gl
Get-DSCLocalConfigurationManager glcm
Get-Member gm
Get-Module gmo
Get-ItemProperty gp
Get-Process gps
Get-ItemPropertyValue gpv
Group-Object group
Get-PSSession gsn
Get-TimeZone gtz
Get-Unique gu
Get-Variable gv
Get-History h
Get-History history
Invoke-Command icm
Invoke-Expression iex
Invoke-History ihy
Invoke-Item ii
Install-Module inmo
Import-Alias ipal
Import-Csv ipcsv
Import-Module ipmo
Invoke-RestMethod irm
Invoke-WebRequest iwr
Stop-Process kill
mkdir md
Measure-Object measure
Move-Item mi
Move-Item move
Move-ItemProperty mp
New-Alias nal
New-PSDrive ndr
New-Item ni
New-Module nmo
New-PSSession nsn
New-Variable nv
Out-Host oh
Publish-DSCConfiguration pbcfg
Pop-Location popd
Publish-Module pumo
Push-Location pushd
Get-Location pwd
Invoke-History r
Remove-PSBreakpoint rbp
Receive-Job rcjb
Receive-PSSession rcsn
Remove-Item rd
Remove-PSDrive rdr
Rename-Item ren
Remove-Item ri
Remove-Job rjb
Remove-Module rmo
Rename-Item rni
Rename-ItemProperty rnp
Remove-ItemProperty rp
Remove-PSSession rsn
Restore-DSCConfiguration rtcfg
Remove-Variable rv
Resolve-Path rvpa
Start-DSCConfiguration sacfg
Start-Job sajb
Set-Alias sal
Start-Process saps
Set-PSBreakpoint sbp
Select-Object select
Set-Variable set
Set-Item si
Set-Location sl
Set-DSCLocalConfigurationManager slcm
Select-String sls
Set-ItemProperty sp
Stop-Job spjb
Stop-Process spps
Set-Variable sv
Test-DSCConfiguration tcfg
Get-Content type
Update-DscLocalConfigurationManager ulcm
Update-DSCConfiguration upcfg
Update-Module upmo
Where-Object where
Wait-Job wjb

PowerShell Coreのエイリアスを調べると、UNIX系コマンドとなるべくかぶらず、かつ、DOSコマンドと同じ名前が用意できる場合にはそれを採用していることがわかる。それ以外のエイリアスは基本的に「動詞-名詞」の頭文字または頭から2~3文字をそれぞれ合わせた短縮名になっている。

アプリケーションではなくコマンドレットに慣れていく

PowerShell Coreでは、環境に用意されているコマンドをアプリケーションとして利用できるため、どうしても最初は使い慣れた環境側のコマンドを使うようにしてPowerShellを使ってしまう。

しかしそれでは、せっかくWindows、macOS、Linuxで動作するPowerShell Coreのポータビリティ性というか、Windowsで手に入れたスキルがそのままmacOSで使える、あるいは、macOSで使っているスキルをそのままWindowsで、というクロスプラットフォームの利点が活かせなくなってしまう。

ということで当面は、PowerShellのコマンドレットまたは関数だけで処理を行うといった学習に取り組んでいくとよいんじゃないかと思う。せっかくなら新しい機能を学習して自らのスキルを伸ばしていこう。