如何将哈希表数组转换为字符串数组

How to convert array of hash tables to array of strings

如何将哈希表数组转换为字符串数组?

我正在尝试创建一个简单的菜单,允许用户从列表中 select 服务器。这是列表的示例:

$sqlServers = @(
    @{
        key="LOCALDB";
        serverName="(localdb)\mssqllocaldb"; 
        credentials="-E";
        userEntry="L"; 
        menuText="(L)ocaldb`t`t((localdb)\mssqllocaldb)"
    },
    @{
        key="DEV";
        serverName="DEV_SERVER"; 
        credentials="-E";
        userEntry="D"; 
        menuText="(D)ev`t`t`t(DEV_SERVER)"
    },
    @{
        key="TEST";
        serverName="TEST_SERVER"; 
        credentials="-E";
        userEntry="T"; 
        menuText="(T)est`t`t`t(TEST_SERVER)"
    }
)

这将显示为:

(L)ocaldb       ((localdb)\mssqllocaldb) 
(D)ev           (DEV_SERVER)
(T)est          (TEST_SERVER)

我想从我的服务器列表中读取有效用户选择列表,然后检查用户按下的键是否在该有效选择列表中。这是我到目前为止得到的:

function Get-UserSelection (
    [Parameter(Mandatory=$True)]
    $servers
    )
{
    Write-Host "Select the server to run the SQL scripts on (type a letter followed by the [Enter] key, or press CTRL+C to exit)"

    foreach ($server in $servers)
    {
        Write-Host "`t" $server.menuText
    }

    $validSelections = $servers | Select-Object {$_.userEntry}
    $userSelection = ""

    while ($True)
    {
        $userSelection = Read-Host         

        ForEach ($validSelection in $validSelections)
        {
            if ($userSelection -eq $validSelection) 
            {
                return $userSelection
            }
        }
                
        Write-Host "Invalid selection.  Please try again or press CTRL+C to exit"
    }
}

问题是 $validSelection 在转换为字符串时的值不是 LD,而是像 @{$_.userEntry=L} 这样的值,所以$userSelection (eg "d") 从未被视为有效。

我认为问题出在以下行:

$validSelections = $servers | Select-Object {$_.userEntry}

我如何修改它,使 $validSelections 是一个 字符串数组 而不是自定义对象数组?

你快到了。只需使用 ForEach-Object cmdlet 对每个哈希表 迭代 和 select userEntry

$validSelections = $sqlServers | ForEach-Object {$_.userEntry}

您也可以像这样在 Select-Object 上使用 -ExpandProperty

$sqlServers = @(
    @{userEntry="L"; },
    @{userEntry="D"; },
    @{userEntry="T"; }
)
$sqlServers | Select-Object -ExpandProperty userEntry