Поддерживает ли PowerShell сериализацию HashTable? - PullRequest
2 голосов
/ 10 марта 2020

Если я хочу записать объект / HashTable на диск и позже загрузить его снова, поддерживает ли PowerShell это?

Ответы [ 3 ]

3 голосов
/ 10 марта 2020

Конечно, вы можете использовать PowerShell нативный CliXml формат :

@{
  a = 1
  b = [pscustomobject]@{
    prop = "value"
  }
} | Export-Clixml -Path hashtable.ps1xml

Десериализовать с Import-CliXml:

PS C:\> $ht = Import-CliXml hashtable.ps1xml
PS C:\> $ht['b'].prop -eq 'value'
True
2 голосов
/ 10 марта 2020

Поскольку таблица PowerShell ha sh по умолчанию (@{...}) имеет тип Object, Object, она не относится только к типу HashTable, но вопрос подразумевает сериализацию any * 1006. * (значение) тип на диск.

В дополнение к ответу @ Mathias R. Jessen вы можете использовать сериализатор PowerShell ( System.Management.Automation .PSSerializer ) для этого:

Сериализация на диск

[System.Management.Automation.PSSerializer]::Serialize($HashTable) | Out-File .\HashTable.txt

Десериализация с диска

$PSSerial = Get-Content .\HashTable.txt
$HashTable = [System.Management.Automation.PSSerializer]::Deserialize($PSSerial)

Вы также можете использовать этот ConvertTo-Expression командлет. Недостатком является то, что это нестандартный командлет PowerShell для сериализации, но преимущество заключается в том, что вы можете использовать стандартную и простую точечную выборку для ее восстановления:

Сериализация на диск

$HashTable | ConvertTo-Expression | Out-File .\HashTable.ps1

Десериализация с диска

$HashTable = . .\HashTable.ps1
2 голосов
/ 10 марта 2020

Ответ может зависеть от данных в вашей хеш-таблице. Относительно простых данных Export-Clixml и Import-CliXml - это простое и простое решение PowerShell, см. Другой ответ.

Для более сложных данных, не слишком сериализованных через CliXml, но. NET сериализуемых, вы может использовать один из стандартных. NET сериализаторов. Например, BinaryFormatter. Вы можете использовать (или изучить код) два готовых сценария: Export-Binary.ps1 и Import-Binary.ps1 . Вы можете найти демонстрационные примеры, включая хеш-таблицу, в Export-Binary.test.ps1 .

И, если вы хотите эффективно хранить много хеш-таблиц , ищите какие-то решения для хранения документов. Недавно я обнаружил, что LiteDB очень хорош для многих сценариев PowerShell ios. Поэтому я создал Ldb c, оболочку PowerShell для LiteDB, включая батареи. Используя этот способ, вы можете хранить и извлекать тысячи хеш-таблиц.

ОБНОВЛЕНИЕ: Если вы предпочитаете хранить относительно простые данные в PSD1 (собственный формат данных PowerShell), вы также можете использовать модуль сценария PsdKit . (Спасибо @iRon за напоминание)

...