1

我有一个连接到 localhost API 的 PowerShell 脚本,该 API 返回“会话”字典以及它们是否处于活动状态

[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

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

Session Name: ExampleSession
User Logged In: ExampleUser

但是当只有 1 处于活动状态时,它只返回第一个字母:

Session Name: E
User Logged In: E

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

4

1 回答 1

2

这意味着如果只返回一个会话,$response.userId并且$response.sessionName不是单元素数组而只是字符串- 并且对字符串进行索引会返回字符(例如,'foo'[0]returns 'f')。[1]

您可以使用@()数组子表达式运算符来确保您始终在处理数组

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

如果会话数可能很大,则以下执行得更好(因为@(...)创建了数组[2]的(浅)副本,而演员表按原样使用现有数组):[array]

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

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

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

于 2021-02-07T06:20:10.430 回答