问题
If I want to write an object / HashTable to disk and load it up again later does PowerShell support that?
回答1:
Sure, you can use PowerShell's native CliXml format:
@{
a = 1
b = [pscustomobject]@{
prop = "value"
}
} | Export-Clixml -Path hashtable.ps1xml
Deserialize with Import-CliXml:
PS C:\> $ht = Import-CliXml hashtable.ps1xml
PS C:\> $ht['b'].prop -eq 'value'
True
回答2:
The answer may depend on the data in your hashtable. For relatively simple data
Export-Clixml
and Import-CliXml
is the native and straightforward
PowerShell solution, see another answer.
For more complex data, not well serialized via CliXml
, but .NET serializable,
you may use one of the standard .NET serializers. For example, BinaryFormatter
.
You may use (or learn the code) two ready scripts: Export-Binary.ps1 and Import-Binary.ps1.
You may find demo examples, including the hashtable, in Export-Binary.test.ps1.
And, if you want to store many hashtables effectively then look for some sort of document store solutions. I recently found that LiteDB is very good for many PowerShell scenarios. So I created Ldbc, the PowerShell wrapper of LiteDB, batteries included. Using this way, you may store and retrieve thousands of hashtables.
UPDATE: If you prefer to store relatively simple data in PSD1 (native PowerShell data format), you may also use the script module PsdKit. (Thank you @iRon for reminding)
回答3:
As the default PowerShell hash table (@{...}
) is of type Object
, Object
it doesn't concern just a HashTable
type but the question implies serializing of any (value) type to disk.
In addition to the answer from @Mathias R. Jessen, you might use the PowerShell serializer (System.Management.Automation.PSSerializer) for this:
Serialize to disk
[System.Management.Automation.PSSerializer]::Serialize($HashTable) | Out-File .\HashTable.txt
Deserialize from disk
$PSSerial = Get-Content .\HashTable.txt
$HashTable = [System.Management.Automation.PSSerializer]::Deserialize($PSSerial)
You could also use this ConvertTo-Expression cmdlet. The downside is that is concerns a non-standard PowerShell cmdlet for serializing but the advantage is that you might use the standard and easy dot-sourcing technique to restore it:
Serialize to disk
$HashTable | ConvertTo-Expression | Out-File .\HashTable.ps1
Deserialize from disk
$HashTable = . .\HashTable.ps1
来源:https://stackoverflow.com/questions/60621582/does-powershell-support-hashtable-serialization