【问题标题】:Using non-string as $env: variable使用非字符串作为 $env: 变量
【发布时间】:2012-10-19 03:50:56
【问题描述】:

我想在环境变量中存储一个哈希表——这在 Powershell 中可行吗?

我是这样测试的:

$env:test = @{}
$env:test
$env:test|gm

感到困惑,因为输出是:

System.Collections.Hashtable

类型名称:System.String

名称成员类型定义

---- ---------- ---------- 克隆方法 System.Object Clone()
CompareTo 方法 int CompareTo(System.Object 值),int CompareTo(字符串 strB) ...

...所以当我直接返回 $env:test 时,我得到了 'Hashtable',但是当我通过管道将它传递给 get-member 时, 返回 system.string。有人可以解释一下这种行为吗?

【问题讨论】:

  • 为什么需要在环境变量中这样做?
  • 另外,环境变量总是字符串。期间。
  • 我有一个 {[int]$id,[System.Management.Automation.PSCredential]$cred} 的哈希值,我希望能够从脚本中的任何位置访问它。 env vars 总是字符串是有道理的,但为什么原始问题中描述的奇怪行为?
  • 可以从脚本中的任何位置访问具有全局或脚本范围的变量。在提示符下输入:Get-Help about_scopes
  • 没有特别的理由需要环境变量。我有一些变量存储在自定义环境空间中(例如:$env:MYSPACE:foo),我想知道我是否也可以在该空间中存储对象或引用。

标签: powershell environment-variables hashtable


【解决方案1】:

环境变量($env:stringVariable) 是字符串。但是,您似乎希望将哈希表类型的非字符串变量设为全局变量。这可以通过使用 全局修饰符 ($global:hashtableVariable) 来完成。这将允许您从一个脚本文件访问另一个脚本文件中的变量,如此处所示

PowerShellScriptFile-1.ps1

$global:hashtableVariable = @{
   'key1' = 'value1'
   'key2' = 'value2'
}

PowerShellScriptFile-2.ps1

$global:hashTableVariable.GetEnumerator() | ForEach-Object {
       Write-Host "$($_.Key):$($_.Value)"
}

【讨论】:

    【解决方案2】:

    知道了。 “System.Collections.Hashtable”是分配给$env:test的字符串值

    【讨论】:

    • 是的。由于环境变量只能是字符串,因此当您为其分配哈希时,Pwershell 会尝试将哈希强制转换为字符串。为此,Powershell 在返回 System.Collections.Hashtable 的哈希表对象上调用 .ToString() 方法。因此,它存储在 env 变量中。
    【解决方案3】:

    晚了一点,但现在你可以这样做了,但由于环境变量是严格的字符串,你需要将它分配给你代码中的其他东西,你需要使用@987654322 @模块。

    import-module Microsoft.PowerShell.Utility 
    $hash = ConvertFrom-StringData -StringData $env:myvar
    

    您需要适当地格式化您的环境变量,例如:

    $env:myvar = "Fname = John ``n Lname= Smith ``n DOB = 01/01/1980"
    

    只使用一个反引号,我不知道如何只让一个显示正确。

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertfrom-stringdata?view=powershell-7

    【讨论】:

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