A "standard" library for PowerShell inspired by the preludes of Haskell, ReasonML, Rust, Purescript, Elm, Scala cats/scalaz, and others. It provides useful helpers, functions, utilities, wrappers, type accelerators, and aliases for things you might find yourself wanting to do on a somewhat regular basis - from meta-programming to linear algebra.
Open PowerShell prompt (or Windows Terminal app)
Install Prelude module via PowerShell Gallery
Install-Module -Name Prelude -Scope CurrentUser
[ALTERNATIVE] Download this repo and save the ./Prelude folder to your modules directory. You can list your module directories by executing $Env:PSModulePath -split ';'
in your PowerShell terminal. Choose one that suits your needs and permissions.
Import Prelude into current context
Import-Module -Name Prelude
Note For scripts, add
#Requires -Modules Prelude
to the top of your file - the "Requires" directive will prevent your script from running without the required module dependencies (reference)
Are you new to PowerShell? If so, please look through this presentation for a quick introduction to the merits and magic of PowerShell and how Prelude makes it even better. If you are already familiar with another language (like Python or JavaScript), you can look at these comparisons of Prelude to other popular languages, libraries, and tools.
PowerShell isn't limited to purely functional programming like Haskell or confined to a browser like Elm. Interacting with the host computer (and other computers) is a large part of PowerShell’s power and purpose. A prelude for PowerShell should be more than “just” a library of utility functions. It should also help “fill the gaps” in the language that one finds after constant use, within and beyond5 the typical use cases. The myriad use cases include:
"It's almost like someone just browsed the awesome-powershell repository, read some PowerShell scripting blogs, wrote some C# versions of algorithms, and then added all their favorite functions and aliases into a grab-bag module…"
- Anonymous
This module provides data types and patterns for scripting within a ubiquitous terminal environment. Prelude enables complex analysis, strives to make your scripts more sustainable, encourages you to put away the black boxes6, and empowers you to take control of your productivity. It works almost everywhere and can be "installed"7 without system/administrator/root privileges.
Note For maximum effectiveness, it's recommended that you add
Import-Module -Name Prelude
to your Windows Terminal$PROFILE
. I certainly do.
Naturally, it has ZERO external dependencies2 and (mostly) works on Linux3 ;)
Although
Prelude
has more than the standard "standard" library, it still comes packed with functions engineered to enhance script sustainability
'cat' | Get-Permutation
# or use the "method" format, and make a list
'cat'.Permutations() | Join-StringsWithGrammar # "cat, cta, tca, tac, atc, and act"
$Abc = 'b' | insert -To 'ac' -At 2
$Abc = 'abcd' | remove -Last
$Sum = 1..100 | reduce { Param($A, $B) $A + $B }
# or with the -Add switch
$Sum = 1..100 | reduce -Add
{ whoami } | irc -ComputerNames PCNAME
say 'Hello World'
{ say 'Hello World' } | irc -ComputerNames PCNAME
{ 'Event triggered' | Write-Color -Red } | on 'SomeEvent'
# You can even listen to variables!!!
# Declare a value for boot
$Boot = 42
# Create a callback
$Callback = {
$Data = $Event.MessageData
say "$($Data.Name) was changed from $($Data.OldValue), to $($Data.Value)"
}
# Start the variable listener
$Callback | listenTo 'Boot' -Variable
# Change the value of boot and have your computer tell you what changed
$Boot = 43
Create complex UI elements like paginated multi-select menus
Create a full form in the terminal (see the ./kitchensink.ps1 for a more extensive example)
'Example' | Write-Title
$Fullname = input 'Full Name?' -Indent 4
$Username = input 'Username?' -MaxLength 10 -Indent 4
$Age = input 'Age?' -Number -Indent 4
$Pass = input 'Password?' -Secret -Indent 4
$Word = input 'Favorite Saiya-jin?' -Autocomplete -Indent 4 -Choices @('Goku','Gohan','Goten','Vegeta','Trunks')
'Favorite number?' | Write-Label -Indent 4 -NewLine
$Choice = menu @('one'; 'two'; 'three') -Indent 4
Get-ChildItem -File | Invoke-Reduce -FileInfo | Write-BarChart
Prelude
includes a handful of functions and aliases that will make you more productive
touch somefile.txt
take ~/path/to/some/folder
# ...all monitors
screenshot
#...or just one
2 | screenshot
Get-Location | Find-Duplicate
tree
)ConvertFrom-FolderStructure | Out-Tree
'bookmarks.html' | Import-Html | Get-HtmlElement 'a' | prop 'href' | ? { -not (Test-Url $_) }
List all functions with
Get-Command -Module Prelude -CommandType Function
. UseGet-Help <Function-Name>
to see usage details.
Add-Metadata
ConvertFrom-Base64
ConvertFrom-ByteArray
ConvertFrom-EpochDate
ConvertFrom-Html
ConvertFrom-FolderStructure
ConvertFrom-Pair
ConvertFrom-QueryString
ConvertTo-AbstractSyntaxTree
ConvertTo-Base64
ConvertTo-Degree
ConvertTo-Html
ConvertTo-PowerShellSyntax
ConvertTo-Iso8601
ConvertTo-JavaScript
ConvertTo-OrderedDictionary
ConvertTo-Pair
ConvertTo-ParameterString
ConvertTo-PlainText
ConvertTo-QueryString
ConvertTo-Radian
Deny-Empty
Deny-Null
Deny-Value
Enable-Remoting
Find-Duplicate
Find-FirstIndex
Format-ComplexValue
Format-FileSize
Format-Json
Format-MinimumWidth
Format-MoneyValue
Get-Covariance
Get-DefaultBrowser
Get-Extremum
Get-Factorial
Get-GithubOAuthToken
Get-HostsContent
Get-HtmlElement
Get-LogisticSigmoid
Get-Maximum
Get-Minimum
Get-ParameterList
Get-Permutation
Get-Plural
Get-Property
Get-Screenshot
Get-Singular
Get-Softmax
Get-State
Get-StateName
Get-StringPath
Get-SyllableCount
Get-TemporaryDirectory
Get-Variance
Import-Excel
Import-Html
3
Import-Raw
Install-SshServer
Invoke-Chunk
Invoke-DropWhile
Invoke-Flatten
Invoke-FireEvent
Invoke-GoogleSearch
Invoke-Imputation
Invoke-Input
Invoke-InsertString
Invoke-ListenTo
Invoke-ListenForWord
3
Invoke-MatrixMap
Invoke-Menu
Invoke-Method
Invoke-NewDirectoryAndEnter
Invoke-Normalize
Invoke-NpmInstall
Invoke-ObjectInvert
Invoke-ObjectMerge
Invoke-Omit
Invoke-Once
Invoke-Operator
Invoke-Pack
Invoke-Partition
Invoke-Pick
Invoke-PropertyTransform
Invoke-Reduce
Invoke-Repeat
Invoke-RemoteCommand
Invoke-Reverse
Invoke-RunApplication
Invoke-Speak
3
Invoke-StopListen
Invoke-TakeWhile
Invoke-Tap
Invoke-Unpack
Invoke-Unzip
Invoke-WebRequestBasicAuth
Invoke-Zip
Invoke-ZipWith
Join-StringsWithGrammar
Measure-Performance
Measure-Readability
New-ComplexValue
New-DailyShutdownJob
New-DesktopApplication
New-File
New-Template
New-TerminalApplicationTemplate
New-WebApplication
Open-Session
Out-Browser
Out-Tree
Remove-Character
Remove-DailyShutdownjob
Remove-DirectoryForce
Remove-HandlebarsHelper
Remove-Indent
Rename-FileExtension
Save-File
Save-JsonData
Save-State
Save-TemplateData
Test-Admin
Test-ApplicationContext
Test-Command
Test-DiagonalMatrix
Test-Empty
Test-Enumerable
Test-Equal
Test-Installed
Test-Matrix
Test-SquareMatrix
Test-SymmetricMatrix
Test-Url
Update-Application
Update-HostsFile
Use-Grammar
3
Use-Speech
3
Use-Web
3
Write-BarChart
Write-Color
Write-Label
Write-Status
Write-Title
Use
Get-Alias <Name>
to see alias details. Example:Get-Alias dra
# View all Prelude aliases
Get-Alias | Where-Object { $_.Source -eq 'Prelude' }
[Complex]
Shortcut for
System.Numerics.Complex
provided for convenience
$C = [Complex]::New(1, 7)
# ...or use the helper function
$C = complex 1 7
# Complex values have a custom format ps1xml file
# simply return a complex value to see the beauty
$C
# ...or format complex values for us in your scripts
$C | Format-ComplexValue -WithColor | Write-Label
Note Full class name is
System.Numerics.Complex
[Coordinate]
Class for working with geodetic and Cartesian earth coordinate values.
$Omaha = [Coordinate]@{ latitude = 41.25; longitude = -96 }
$Omaha.ToString()
# 41°15'0"N 96°0'0"W
$Omaha.ToCartesian()
# -501980.225469305, -4776022.81392779, 4183337.21339675
# Calculate distance between two points on the earth
$SanDiego = [Coordinate]@{ latitude = 32.7157 ; longitude = -117.1611 }
$Distance = $Omaha - $SanDiego
# Distance = 2097705.740066118 (meters)
Note Full class name is
Prelude.Geodetic.Coordinate
[Datum]
Namespace for geodetic constants
[Datum]::Radius | Write-Color -Cyan
# output 6371001
Note Full class name is
Prelude.Geodetic.Datum
[Matrix]
Perform all kinds of matrix math. Tested on many math books - 100% Guaranteed to make homework easier4
$A = [Matrix]::New(3)
$A.Rows = 1..9
# ...or use the helper function
$A = 1..9 | matrix 3,3
# ...and then do math!
$A.Det() -eq 0 # true, looks like this matrix isn't going to have an inverse!
# ...and more math
$B = 2 * $A
$Product = $A * $B
$Sum = $A + $B
$IsEqual = $A -eq $B # $IsEqual is False
$I = matrix 3,3 -Identity
$IsEqual = (2 * $I) -eq ($I + $I) # now $IsEqual is True!
# fit a simple linear regression model
$X0 = 1,1,1,1,1 | matrix 5,1
$X1 = -2,-1,0,1,2 | matrix 5,1
$X = $X0.Augment($X1)
$Y = 0,0,1,1,3 | matrix 5,1
$B = ($X.Transpose() * $X).Inverse() * ($X.Transpose() * $Y)
# ==> The result is a 2x1 matrix with the desired values (1 and 0.7, in this case)
Note Full class name is
Prelude.Matrix
[Node]
Simple node data structure for use with Graph data structure
$A = [Node]'a'
$B = [Node]'b'
$C = [Node]'c'
Note Full class name is
Prelude.Node
[Edge]
Simple edge data structure for use with Graph data structure. Edges are composed of two nodes and an optional weight (default weight is
1
).
Un-weighted graphs can be constructed by using default weight of 1 for all associated edges).
$AB = [Edge]::New($A, $B)
$BC = [Edge]::New($B, $C)
# OR you can use PowerShell helper functions
$AB = New-Edge $A $B
$BC = New-Edge $B $C
Note Full class name is
Prelude.Edge
[DirectedEdge]
Exactly like
[Edge]
, but directed.
$AB = [DirectedEdge]::New($A, $B)
$BC = [DirectedEdge]::New($B, $C)
# OR you can use PowerShell helper functions
$AB = New-Edge -From $A -To $B -Directed
$BC = New-Edge -From $B -To $C -Directed
Note Full class name is
Prelude.DirectedEdge
[Graph]
Data structure to model objects (nodes) and relations (edges). Named
[Graph]
instead of[Network]
to avoid confusion with computer networks, a common use case for PowerShell.
$Nodes = $A, $B, $C
$Edges = $AB, $BC
$G = New-Graph $Nodes $Edges
# OR create graph using just edges
# (necessary nodes are "auto" added)
$G = [Graph]::New($Edges)
# Add nodes
$D = [Node]'d'
$G.Add($D)
# View adjacency matrix
$G.AdjacencyMatrix
# algorithms and other cool stuff are UNDER CONSTRUCTION
Note Full class name is
Prelude.Graph
For details on how to extend types with
Types.ps1xml
files, see About Types.ps1xml
Prelude uses type extensions to provide method versions of most core functions. This may be useful in some situations (or if you just don't feel like using pipelines…)
Examples
# Factorials
(4).Factorial() # 24
# Permutations as a property (similar property for numbers and arrays)
'cat'.Permutations() # 'cat','cta','tca','tac','atc','act'
# Flatten an array
@(1,@(2,3,@(4,5))).Flatten() # 1,2,3,4,5
# Reduce an array just like you would in other languages like JavaScript
$Add = { Param($a,$b) $a + $b }
@(1,2,3).Reduce($Add, 0) # 6
Note For the full list of functions, read through the
ps1xml
files in the types directory.
Have an idea? Want to help contribute? Check out the contributing guide.
This module is NOT an "official" Microsoft PowerShell prelude module
This code is inspired and enabled by several people and projects
The following functions aren't supported on Linux:
Invoke-ListenForWord
Invoke-Speak
Import-Html
Use-Grammar
Use-Speech
Use-Web
Results may vary. The 100% guarantee is 100% uncertain in 100% of cases.
Sometimes way beyond :)
Compiled code, closed source software, arcane code snippets copy/pasted from the internet nether-realm, etc…
The installation of Prelude can be as simple as copying the ./Prelude folder into one of the directories in your
$Env:PSModulePath
variable.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。