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

时间:2021-02-07 06:03:51

标签: powershell

我有一个 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 引起的,但是到目前为止我无法找到问题的根源。

1 个答案:

答案 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') 不是严格需要的( @(...) 一个人就可以了。