【问题标题】:Loading a PowerShell hashtable from a file?从文件加载 PowerShell 哈希表?
【发布时间】:2012-05-24 19:14:56
【问题描述】:

我有一个文件,其中包含 PowerShell 对象表示法中的一些数据:

@{ X = 'x'; Y = 'y' }

我想将它从文件中加载到一个变量中。

【问题讨论】:

  • 对于一个哈希数组,是否每一行都包含在@{}中,比如@{Z = 'z'; A='a' }?

标签: powershell


【解决方案1】:

(我在整理复制品时发现了)

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

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

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

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

PS> $data = gc .\foo.pson | Out-String | iex

(我找不到更短的Out-String

【讨论】:

  • 也许这是 Powershell 4 的东西,但我可以跳过 Out-String 部分,只需执行以下操作: $hash = Get-Content .\file.pson |调用表达式
【解决方案2】:

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

$data = <path>\data.ps1

【讨论】:

  • 是的(我没有意识到我不必对文件进行点源),但看起来它可以直接运行,我不是特别想要。
【解决方案3】:

我使用了 ConvertFrom-StringData。如果您想使用这种方法,您需要更改存储键/值对的方式,每个键/值对都在自己的行中并且没有引号:

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

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

Name                           Value
----                           -----
X                              x
Y                              y

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

【讨论】:

  • 我没有在问题中提到它(为了简单起见),但该文件实际上包含一个对象树:一个哈希表数组,包含其他数组和哈希表。
【解决方案4】:

从 PowerShell 5.0 开始

Import-PowerShellDataFile

从 .psd1 文件中导入值。因此,您唯一需要做的就是将文件重命名为 *.psd1

官方帮助是here

【讨论】:

    【解决方案5】:

    这是一篇较旧的帖子,但是,这对您接受的解决方案有点扭曲,并且可能稍微“安全”一些,请记住不受信任的文件。

    从您的笔记中,您有一个包含使用 Powershell 语法的哈希表的文件。鉴于该约束,您可以直接导入它:

    $HashPath = ".\foo.pson"
    # input file contents
    $filecontent = Get-Content -Path $HashPath -Raw -ErrorAction Stop
    # put the file in a script block
    $scriptBlock = [scriptblock]::Create( $filecontent )
    #check that the file contains no other Powershell commands
    $scriptBlock.CheckRestrictedLanguage( $allowedCommands, $allowedVariables, $true )
    #execute it to create the hashtable 
    $hashtable = ( & $scriptBlock ) 
    

    注意$scriptBlock.CheckRestrictedLanguage,您可以将其替换为

    $scriptBlock.CheckRestrictedLanguage([string[]]@(), [string[]]@(), $false)
    

    使用空字符串列表,因此我们不允许任何 Powershell 命令。导入哈希表时,这正是我们想要的。最后一个是allowEnvironmentVariables,所以我们在这个例子中用$false来限制它。

    旁注,Powershell 模块(psd1 文件)只是一个哈希表,所以这个概念可以帮助你也拉入脚本块或其他东西。

    参考:https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.checkrestrictedlanguage?view=powershellsdk-1.1.0

    【讨论】:

      【解决方案6】:

      按照@Chad 的建议,我在使用 ConvertFrom-StringData 时遇到了麻烦。如果你这样做:

      $hash = get-content .\test.txt | ConvertFrom-StringData
      

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

      $hash.GetType()
      

      看起来您需要加入 slurped 输入文件的每一行,以确保它形成一个字符串供 ConvertFrom.. 使用:

      $hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData
      

      【讨论】:

      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多