Powershell 数据类型转换

问题描述 投票:0回答:1

对于针对 REST API 的单个 Web 会话,我尝试将所有不会更改的值捆绑到单个对象中,以便在函数之间传递并用于后续调用。

请记住,如果我将所有这些分开并将多个不同类型的对象发送到所有函数,那么这是可行的。只有当我尝试将所有常见的东西捆绑到一个对象中时,我才会遇到麻烦。

因此,我进行初始调用并捕获我需要的所有数据并将其填充到 $mySession 中:

$uriBase = "https://servername/api"
$uri = "$uriBase/therestof/theuri"

Invoke-RestMethod -Uri $uri -Method Put -contentType "application/json" -SessionVariable "Session" -Body $body

$headers = @{
    'x-xsrf-token' = $XSRFTOKEN
    'accept' = 'application/json'
    'Cache-Control' = 'no-cache'
}

$mySession = [PSCustomObject]@{}
$mySession | Add-Member -MemberType NoteProperty -Name 'uriBase' -Value $uriBase
$mySession | Add-Member -MemberType NoteProperty -Name 'Session' -Value $Session
$mySession | Add-Member -MemberType NoteProperty -Name 'Headers' -Value $headers

但是当我尝试使用这个时...

$uri = "$($mySession.uriBase)/another/uri"
$headers = $mySession.Headers
$Session = $mySession.Session

$rslt = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -contentType "application/json" -WebSession $Session

...我对对象类型有疑问。

 | … t = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -conten …
 |                                                         ~~~~~~~~
 | Cannot convert 'System.Object[]' to the type 'System.Collections.IDictionary' required by parameter 'Headers'. Specified method is not   
 | supported.

我尝试通过在存储之前转换 $headers 来适应这一点。

[System.Collections.IDictionary]$headers = @{
    'x-xsrf-token' = $XSRFTOKEN
    'accept' = 'application/json'
    'Cache-Control' = 'no-cache'
}

...本身不会产生错误,但在调用

Invoke-RestMethod
时我仍然遇到相同的错误。

从对象中获取值,然后在使用它之前对其进行转换...

[System.Collections.IDictionary]$headers = $mySession.Headers

...产生错误消息:

|      [System.Collections.IDictionary]$headers = $CognosSession.Headers
|      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Collections.IDictionary".

检查类型:

Write-Host $headers.GetType() | Format-List -Property *

...在两种情况下(有或没有强制转换)都告诉我 $headers 是一个

System.Collections.Hashtable
那么它是 System.Collections.Hashtable 还是 System.Object[]? (这是否意味着它是一个 System.Objects 数组?)

Microsoft 的

Add-Member
文档指出:

-类型名称
指定类型的名称。

该文档似乎对我没有多大帮助。 “……针对什么类型”?我认为这是针对会员类型的。所以我也尝试用这种方式选角:

$mySession | Add-Member -MemberType NoteProperty -Name 'Headers' -Value $headers -TypeName 'System.Collections.IDictionary'

...这样...

$mySession | Add-Member -MemberType NoteProperty -Name 'Headers' -Value $headers -TypeName IDictionary

还是没有爱。

那么,我在这里做错了什么?我应该使用

PSCustomObject
Add-Member
以外的其他东西吗?

powershell rest
1个回答
0
投票

我花了一天时间与类似的事情作斗争——我发现了一些我不完全理解的 PS 打字行为。 (我是一名资深程序员,但 PS 新手。)

PowerShell 有时会在分配过程中以令人惊讶的方式更改对象类型。就我而言,在赋值之前初始化变量解决了问题。在你的情况下,也许这样的事情就能解决问题:

$headers = $null
# .. or $headers = @()

$headers = $mySession.Headers

如果这不起作用,请尝试

Write-Host $mySession.Headers.GetType
$headers = $mySession.Headers
Write-Host $headers.GetType

看看结果如何。

我很少用猜测来回答问题——但我花了很长时间研究我的问题,我希望我的研究可以为您节省几个小时。

就我而言,字符串中有一个意外的前导空格。我发现的大多数“解决方案”都是“use Trim()”的变体。这将使代码正常工作,但实际上并不能解决问题。广泛使用 GetType() 回答了很多问题。 (唉,它还创建了其他一些我仍在研究的内容。)

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.