从文件加载PowerShell哈希表?

Rog*_*mbe 15 powershell

我有一个包含PowerShell Object Notation中的一些数据的文件:

@{ X = 'x'; Y = 'y' }
Run Code Online (Sandbox Code Playgroud)

我想将它加载到文件中的变量中.

Rog*_*mbe 20

(我把它放在一起时我想出来了)

PS> $content = ( Get-Content .\foo.pson | Out-String )
PS> $data = ( Invoke-Expression $content )
Run Code Online (Sandbox Code Playgroud)

Get-Content返回一个包含文件中行的数组; 将Out-String用于连接在一起.

Invoke-Expression然后运行脚本,并捕获结果.这对注射攻击是开放的,但在这种情况下这没关系.

或者,如果您更喜欢PowerShell简洁:

PS> $data = gc .\foo.pson | Out-String | iex
Run Code Online (Sandbox Code Playgroud)

(我找不到更短的形式Out-String)


Cha*_*ler 9

我使用过ConvertFrom-StringData.如果你想使用这种方法,你需要改变存储键/值对的方式,每个键都有自己的行,没有引号:

#Contents of test.txt
X = x
Y = y

get-content .\test.txt | ConvertFrom-StringData

Name                           Value
----                           -----
X                              x
Y                              y
Run Code Online (Sandbox Code Playgroud)

ConvertFrom-StringData是一个内置的cmdlet.我在这里创建了相应的ConvertTo-StringData函数http://poshcode.org/1986


Art*_*kov 7

从 PowerShell 5.0 开始,您有

Import-PowerShellDataFile
Run Code Online (Sandbox Code Playgroud)

它从 .psd1 文件导入值。所以您唯一要做的就是将文件重命名为 *.psd1

官方帮助在这里


Rom*_*min 5

如果你可以给这个文件扩展名.ps1data.ps1那么它就不会比这段代码更简单:

$data = <path>\data.ps1
Run Code Online (Sandbox Code Playgroud)


Tim*_*ass 5

我遇到了使用@@ Chad建议的ConvertFrom-StringData的麻烦。如果您这样做:

$hash = get-content .\test.txt | ConvertFrom-StringData
Run Code Online (Sandbox Code Playgroud)

我发现我有一个对象数组而不是哈希表。实际上,看来我有一个哈希表数组,每个哈希表都有一个条目。我确认了:

$hash.GetType()
Run Code Online (Sandbox Code Playgroud)

看来您需要连接已隔离的输入文件的每一行,以确保它形成一个单独的字符串以供ConvertFrom ..使用:

$hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData
Run Code Online (Sandbox Code Playgroud)

  • 您也可以只使用`Get-Content -Raw。\ test.txt`停止将文件逐行通过管道传递到`ConvertFrom-StringData`;。http://www.geekality.net/2014/06/30/powershell-read-hashtable-from-a-file/ (6认同)