I'm trying to find a TOML file parser for PowerShell.
I can't find any information about it either in PowerShell Gallery or in the preinstalled PowerShell functions.
Indeed, as of this writing, there seems to be no PowerShell module for TOML parsing published in the PowerShell Gallery:
However, there is a .NET package available in the NuGet Gallery:
While you can consume NuGet packages from PowerShell, doing so is nontrivial as of PowerShell Core 7.2.2, unfortunately.
This answer discusses the current pitfalls and potential future enhancements.
In this particular case, because the package has no dependencies, you can get away with downloading the package via Install-Package
, as shown below:
Sample use:
# Determine the package's local installation location.
# If it isn't installed, install it first, in the current user's scope.
while (-not ($installDir = (Get-Package -ErrorAction Ignore -ProviderName NuGet Tomlyn).Source)) {
$null = Install-Package -Scope CurrentUser -ErrorAction Stop -ProviderName NuGet Tomlyn
}
# Load the package's assembly into the session.
Add-Type -ErrorAction Stop -LiteralPath (Join-Path $installDir '../lib/netstandard2.0/Tomlyn.dll')
# Define a sample TOML string to parse.
$tomlStr = @'
global = "this is a string"
# This is a comment of a table
[my_table]
key = 1 # Comment a key
value = true
list = [4, 5, 6]
'@
# Parse the TOML string into an object mod)el (nested dictionaries).
$tomlTable = [Tomlyn.Toml]::ToModel($tomlStr)
# Output the '[my_table]' section's 'list' value.
# -> 4, 5, 6
# IMPORTANT: Use ['<key>'] syntax; .<key> syntax does NOT work.
$tomlTable['my_table']['list']
Note:
With with dictionary types, PowerShell usually allows interchangeable use of index syntax (e.g. ['my_table']
) and dot notation , via .
, the member-access operator (e.g. .my_table
).
However, dot notation is not supported for the dictionaries of type [Tomlyn.Model.Table]
, such as returned by [Tomlyn.Toml]::ToModel()
, presumably because that type only implements the generic IDictionary`2
interface, and not also its non-generic counterpart, IDictionary
.