PowerShell 仅打印字符串的第一个字母

PowerShell printing only first letter of a string

我有一个连接到本地主机的 PowerShell 脚本 API returns “会话”字典以及它们是否处于活动状态

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$response = Invoke-RestMethod 'https://localhost:44356/api/RDM/getSessions' -Method 'GET' -Headers $headers
$numOfUsers = Invoke-RestMethod 'https://localhost:44356/api/RDM/countSessions' -Method 'GET' -Headers $headers
for($x = 0; $x -lt $numOfUsers; $x++)
{
$user = $response.userId[$x]
$name = $response.sessionName[$x]
"`nSession Name: $name"
"User Logged In: $user`n"
}
pause

当多个会话处于活动状态时,它 returns 正确:

Session Name: ExampleSession
User Logged In: ExampleUser

但是当只有 1 个处于活动状态时 returns 只有第一个字母:

Session Name: E
User Logged In: E

我知道这个错误是由脚本而不是 API 引起的,但是到目前为止我无法找到问题的根源。

言外之意,如果只返回一个个session,$response.userId$response.sessionName就不是单元数组 但只是 strings - 并索引到字符串 returns characters (例如,'foo'[0] returns 'f').[1]

您可以使用 @()array-subexpression operator 来确保您始终处理 数组:

$user = @($response.userId)[$x]
$name = @($response.sessionName)[$x]

如果会话的数量可以很大,下面的表现会更好(因为@(...)创建一个(浅)copy数组[ 2],而 [array] 转换按原样使用现有数组):

$user = ([array] $response.userId)[$x]
$name = ([array] $response.sessionName)[$x]

[1] 请注意,与 C# 不同,返回的字符在技术上也是一个 string ([string], System.String), not a [char] (System.Char ) 实例,因为 PowerShell 本身不使用 [char] 类型。

[2] 在较旧的 PowerShell 版本(最高 v5.0)中,这也适用于具有显式枚举元素的数组;例如,@('foo', 'bar'),但这种情况已被优化以适应使用此类表达式定义数组 文字 的广泛实践 - 即使 @(...) 不是绝对需要('foo', 'bar' 一个人就可以)。