PowerShellがOSSになりLinux/Mac版と出てきたので触ってみた

Mac/LinuxばかりでWindows触らなくなってもう半年になります。やっとBashが手についてきたこのごろですが、昨日こんなニュースを見つけました。

www.itmedia.co.jp

Windows使っていた時にはお世話になりっぱなしだったPowerShellがまた使えるかもと思い早速試してみました。

基本情報

レポジトリはこちらです。

github.com

そして、インストール手順はこちらです。MacLinuxも記載されています。 github.com

インストール

Mac版のインストールはPKGファイルなので、ダウンロードしてダブルクリック+ウィザードだけ、Linux版のインストールもダウンロードして、yum install するだけです。

Linux版のインストール手順はこちら。

# wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.9/powershell-6.0.0_alpha.9-1.el7.centos.x86_64.rpm

# yum install powershell-6.0.0_alpha.9-1.el7.centos.x86_64.rpm
----省略
 ================================================================================
 Package    アーキテクチャー
                   バージョン      リポジトリー                            容量
================================================================================
インストール中:
 powershell x86_64 6.0.0_alpha.9-1 /powershell-6.0.0_alpha.9-1.el7.centos.x86_64
                                                                          121 M
依存性関連でのインストールをします:
 libicu     x86_64 50.1.2-15.el7   base                                   6.9 M
 libunwind  x86_64 2:1.1-5.el7_2.2 updates                                 56 k

トランザクションの要約
================================================================================
----省略

起動してみる

powershell 起動しました。

$ powershell
PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS /home/otomo>

バージョン情報の変数も機能しています。

PS /home/otomo> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.0.0-alpha
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   3.0.0.0
GitCommitId                    v6.0.0-alpha.9
CLRVersion
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

少し触ってみる Get-Process + Pipeline

久しぶりにこのパイプライン書いたけど、ちゃんとPowerShellっぽい。

PS /home/otomo> Get-Process | where {$_.ProcessName.Contains("ssh")}

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
      0       0        0          1      0.040    868 868 sshd
      0       0        0          1      0.090  11489 489 sshd
      0       0        0          1      0.440  11492 489 sshd

PSDriveも使える

PowerShellは色々な要素をファイルシステムと同じように利用できるのですが、そのPSDriveはWindows以外でも利用できるようです。

PS /home/otomo> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                      CurrentLocation
----           ---------     --------- --------      ----                                      ---------------
/                   3.05         34.20 FileSystem    /                                              home/otomo
Alias                                  Alias
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
Variable                               Variable

おお、PSDriveしっかり使えてる。

PS /home/otomo> Set-Location Env:
PS Env:/> Get-ChildItem

Name                           Value
----                           -----
_                              /bin/powershell
HISTCONTROL                    ignoredups
HISTSIZE                       1000
HOME                           /home/otomo

コマンドレット数は?

コマンドレットは現時点で345本みたい。手元のWindows10がクリーンインストールで1000本超えてるので、それと比較すれば少ないか。当然と言えば当然ですが。ちなみに同じMacPowerShellも同じ個数です。

PS Env:/> Get-Command | measure | select count

Count
-----
  345
PS Env:/> Get-Command | select name

Name
----
Add-NodeKeys
AddDscResourceProperty
AddDscResourcePropertyFromMetadata
AfterAll
AfterEach
Assert-MockCalled
Assert-VerifiableMocks
BeforeAll
BeforeEach
cd..
cd\
CheckResourceFound
Clear-Host
Compress-Archive
Configuration
Context
ConvertTo-MOFInstance
Describe
Expand-Archive
Find-Command
Find-DscResource
Find-Module
Find-RoleCapability
Find-Script
Format-Hex
Generate-VersionInfo
Get-CompatibleVersionAddtionaPropertiesStr
Get-ComplexResourceQualifier
Get-ConfigurationErrorCount
Get-DscResource
Get-DSCResourceModules
Get-EncryptedPassword
Get-FileHash
Get-InnerMostErrorRecord
Get-InstalledModule
Get-InstalledScript
Get-MockDynamicParameters
Get-MofInstanceName
Get-MofInstanceText
Get-PositionInfo
Get-PSCurrentConfigurationNode
Get-PSDefaultConfigurationDocument
Get-PSMetaConfigDocumentInstVersionInfo
Get-PSMetaConfigurationProcessed
Get-PSRepository
Get-PSTopConfigurationName
Get-PublicKeyFromFile
Get-PublicKeyFromStore
Get-TestDriveItem
Get-Verb
GetCompositeResource
GetImplementingModulePath
GetModule
GetPatterns
GetResourceFromKeyword
GetSyntax
help
Import-PowerShellDataFile
ImportCimAndScriptKeywordsFromModule
ImportClassResourcesFromModule
ImportSystemModules
In
Initialize-ConfigurationRuntimeState
InModuleScope
Install-Module
Install-Script
Invoke-Mock
Invoke-Pester
IsHiddenResource
IsPatternMatched
It
Mock
more
New-DscChecksum
New-Fixture
New-Guid
New-ScriptFileInfo
New-TemporaryFile
Node
oss
Pause
prompt
PSConsoleHostReadline
Publish-Module
Publish-Script
ReadEnvironmentFile
Register-PSRepository
Save-Module
Save-Script
Set-DynamicParameterVariables
Set-NodeExclusiveResources
Set-NodeManager
Set-NodeResources
Set-NodeResourceSource
Set-PSCurrentConfigurationNode
Set-PSDefaultConfigurationDocument
Set-PSMetaConfigDocInsProcessedBeforeMeta
Set-PSMetaConfigVersionInfoV2
Set-PSRepository
Set-PSTopConfigurationName
Setup
Should
StrongConnect
TabExpansion2
Test-ConflictingResources
Test-ModuleReloadRequired
Test-MofInstanceText
Test-NodeManager
Test-NodeResources
Test-NodeResourceSource
Test-ScriptFileInfo
ThrowError
Uninstall-Module
Uninstall-Script
Unregister-PSRepository
Update-ConfigurationDocumentRef
Update-ConfigurationErrorCount
Update-DependsOn
Update-LocalConfigManager
Update-Module
Update-ModuleManifest
Update-ModuleVersion
Update-Script
Update-ScriptFileInfo
ValidateNoCircleInNodeResources
ValidateNodeExclusiveResources
ValidateNodeManager
ValidateNodeResources
ValidateNodeResourceSource
ValidateNoNameNodeResources
ValidateUpdate-ConfigurationData
Write-Log
Write-MetaConfigFile
Write-NodeMOFFile
WriteFile
Add-Content
Add-History
Add-Member
Add-Type
Clear-Content
Clear-History
Clear-Item
Clear-ItemProperty
Clear-Variable
Compare-Object
Connect-PSSession
Convert-Path
ConvertFrom-Csv
ConvertFrom-Json
ConvertFrom-SecureString
ConvertFrom-StringData
ConvertTo-Csv
ConvertTo-Json
ConvertTo-SecureString
ConvertTo-Xml
Copy-Item
Copy-ItemProperty
Debug-Job
Debug-Process
Debug-Runspace
Disable-PSBreakpoint
Disable-PSSessionConfiguration
Disable-RunspaceDebug
Disconnect-PSSession
Enable-PSBreakpoint
Enable-PSSessionConfiguration
Enable-RunspaceDebug
Enter-PSHostProcess
Enter-PSSession
Exit-PSHostProcess
Exit-PSSession
Export-Alias
Export-Clixml
Export-Csv
Export-FormatData
Export-ModuleMember
Find-Package
Find-PackageProvider
ForEach-Object
Format-Custom
Format-List
Format-Table
Format-Wide
Get-Alias
Get-ChildItem
Get-Command
Get-Content
Get-Credential
Get-Culture
Get-Date
Get-Event
Get-EventSubscriber
Get-ExecutionPolicy
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-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-TraceSource
Get-TypeData
Get-UICulture
Get-Unique
Get-Variable
Group-Object
Import-Alias
Import-Clixml
Import-Csv
Import-LocalizedData
Import-Module
Import-PackageProvider
Install-Package
Install-PackageProvider
Invoke-Command
Invoke-Expression
Invoke-History
Invoke-Item
Invoke-RestMethod
Invoke-WebRequest
Join-Path
Measure-Command
Measure-Object
Move-Item
Move-ItemProperty
New-Alias
New-Event
New-Item
New-ItemProperty
New-Module
New-ModuleManifest
New-Object
New-PSDrive
New-PSRoleCapabilityFile
New-PSSession
New-PSSessionConfigurationFile
New-PSSessionOption
New-PSTransportOption
New-TimeSpan
New-Variable
Out-Default
Out-File
Out-Host
Out-Null
Out-String
Pop-Location
Push-Location
Read-Host
Receive-Job
Receive-PSSession
Register-ArgumentCompleter
Register-EngineEvent
Register-ObjectEvent
Register-PackageSource
Register-PSSessionConfiguration
Remove-Event
Remove-Item
Remove-ItemProperty
Remove-Job
Remove-Module
Remove-PSBreakpoint
Remove-PSDrive
Remove-PSReadlineKeyHandler
Remove-PSSession
Remove-TypeData
Remove-Variable
Rename-Item
Rename-ItemProperty
Resolve-Path
Save-Help
Save-Package
Select-Object
Select-String
Select-Xml
Set-Alias
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-StrictMode
Set-TraceSource
Set-Variable
Sort-Object
Split-Path
Start-Job
Start-Process
Start-Sleep
Start-Transcript
Stop-Job
Stop-Process
Stop-Transcript
Tee-Object
Test-ModuleManifest
Test-Path
Test-PSSessionConfigurationFile
Trace-Command
Uninstall-Package
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