我有一个 PowerShell 脚本,它连接到一个 localhost 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 引起的,但是到目前为止我无法找到问题的根源。
答案 0 :(得分:2)
这意味着如果只返回一个会话,$response.userId
和$response.sessionName
不是单元素数组而只是字符串 - 对字符串进行索引返回字符(例如,'foo'[0]
返回'f'
)。[1]
您可以使用 @()
、array-subexpression operator 来确保您始终处理数组:
$user = @($response.userId)[$x]
$name = @($response.sessionName)[$x]
如果会话数可以很大,下面的效果会更好(因为 @(...)
创建了一个数组的(浅)副本[2],而 [array]
转换按原样使用现有数组):
$user = ([array] $response.userId)[$x]
$name = ([array] $response.sessionName)[$x]
[1] 请注意,与 C# 不同,返回的字符在技术上也是 string ([string]
, System.String
),而不是 {{1 }} (System.Char
) 实例,因为 PowerShell 本身不使用 [char]
类型。
[2] 在较旧的 PowerShell 版本(最高 v5.0)中,这也适用于具有显式枚举元素的数组;例如,[char]
,但此情况已被优化以适应使用此类表达式来定义数组 literals 的广泛实践 - 尽管 @('foo', 'bar')
不是严格需要的( @(...)
一个人就可以了。