如何将哈希表数组转换为字符串数组
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
在转换为字符串时的值不是 L
或 D
,而是像 @{$_.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
如何将哈希表数组转换为字符串数组?
我正在尝试创建一个简单的菜单,允许用户从列表中 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
在转换为字符串时的值不是 L
或 D
,而是像 @{$_.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