powershell - 为什么单元素哈希表在 powershell 中的行为不同?

标签 powershell

代码示例:

function ToArray([hashtable] $hashTable){
    $ret = @()
    foreach($key in $hashTable.Keys){
        $ret += ("`"" + $key + ":" + $hashTable[$key] + "`"")
    }
    $ret
}


$h1 = @{
    key1 = "value1" # Only one key in this one
}

$h2 = @{
    key2 = "value2"
    key3 = "value3"
}

$h3 = @{
    key4 = "value4"
    key5 = "value5"
}


$test1 = ToArray $h1
$test1 += ToArray $h3

$test2 = ToArray $h2
$test2 += ToArray $h3

Write-Host
Write-Host "TEST 1:" $test1
Write-Host "TEST 2:" $test2

输出:

TEST 1: "key1:value1""key5:value5" "key4:value4"
TEST 2: "key3:value3" "key2:value2" "key5:value5" "key4:value4"

问题: 为什么 TEST 1 中缺少空格?

最佳答案

在脚本末尾运行以下命令:

PS Y:\> $test1.GetType()
PS Y:\> $test2.GetType()

IsPublic IsSerial Name                                     BaseType            
-------- -------- ----                                     --------            
True     True     String                                   System.Object       
True     True     Object[]   

一个是 String 类型,另一个是 Object Array 类型,当您有单个元素哈希表时,PowerShell 将其视为单个将其分配给变量时的字符串。

PS Y:\> $test1 = ToArray $h1
PS Y:\> $test1.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

所以 PowerShell 然后会在使用 += 时将 $h3 中的所有元素连接成一个大字符串,因为您要添加一个 ArrayString

$test2 向您添加一个 ArrayArray 意味着您将看到输出作为一个更大的数组输出。

要解决这个问题,请显式定义 $test1 的类型和数组:

[array]$test1 = $h1

关于powershell - 为什么单元素哈希表在 powershell 中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119792/

相关文章:

list - powershell列表列表:条目初始化由地址而不是值完成

powershell - 通过Powershell在Outlook中输出缓慢

powershell - 在PowerShell上按日期访问给定文件

powershell - 查找所需的Powershell版本

c# - 从 C# 自定义 Cmdlet 中调用读取主机 cmdlet

powershell - PowerShell here-strings 中的变量必须在哪里初始化?

azure - 将 Base-64 pfx 转换为可用的 pkcs#12

powershell - 远程获取默认打印机

xml - 使用 PowerShell 将 system.xml.xml 元素转换为 system.xml.xml 文档

c# - 无法在PowerShell 3.0和2.0中取消分配内存