相关疑难解决方法(0)

来自JSON的PowerShell Hashtable

我想得到一个Hashtable的JSON表示,如下所示:

@{Path="C:\temp"; Filter="*.js"}
Run Code Online (Sandbox Code Playgroud)

ConvertTo-Json 结果是:

{
    "Path":  "C:\\temp",
    "Filter":  "*.js"
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您将JSON字符串转换回来,ConvertFrom-Json则不会获得HashTable,而是获得PSCustomObject.

那么如何才能可靠地序列化上面的Hashmap呢?

powershell json

18
推荐指数
4
解决办法
2万
查看次数

PowerShell 2.0 ConvertFrom-Json和ConvertTo-Json实现

我想monkeypatch PowerShell 2.0环境,目前无法升级到3.0.

我正在寻找PowerShell 3.0中的ConvertFrom-Jsoncmdlet和ConvertTo-Jsoncmdlet 的PowerShell 2.0脚本实现.

我最感兴趣的是ConvertFrom-Json,但ConvertTo-Json也很好.

powershell json powershell-2.0

17
推荐指数
1
解决办法
2万
查看次数

ConvertFrom-json的哈希表与powershells内置哈希表有不同的类型,我如何使它们相同?

我有一个json文件(test.json),看起来像这样:

{
    "root":
    {
        "key":"value"
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用类似这样的东西将它加载到powershell中:

PS > $data = [System.String]::Join("", [System.IO.File]::ReadAllLines("test.json")) | ConvertFrom-Json

root
----
@{key=value}
Run Code Online (Sandbox Code Playgroud)

我希望能够枚举由json文件定义的'hashtable'之类的对象的键. 所以,理想情况下,我希望能够做到这样的事情:

$data.root.Keys
Run Code Online (Sandbox Code Playgroud)

并得到["关键"].我可以使用PowerShell中的内置哈希表来做到这一点,但是使用从json加载的哈希表来做这件事并不那么明显.

在对此进行故障排除时,我注意到ConvertFrom-json返回的字段与Powershell的哈希表的字段类型不同.例如,在内置哈希表上调用.GetType()会显示它的类型为'Hashtable':

PS > $h = @{"a"=1;"b"=2;"c"=3}
PS > $h.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object
Run Code Online (Sandbox Code Playgroud)

为我的json对象做同样的事情会产生PSCustomObject:

PS > $data.root.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object
Run Code Online (Sandbox Code Playgroud)

有没有办法将此对象转换或转换为典型的PowerShell Hashtable?

powershell json

15
推荐指数
3
解决办法
2万
查看次数

如何将带有附加属性的 PSCustomObject 转换为自定义类

有没有一种巧妙的方法可以将 a 转换PSCustomObject为自定义类作为 PowerShell 5.1 中的函数参数?自定义对象包含附加属性。

我希望能够做这样的事情:

class MyClass {
    [ValidateNotNullOrEmpty()][string]$PropA
}

$input = [pscustomobject]@{
    PropA          = 'propA';
    AdditionalProp = 'additionalProp';
}

function DuckTypingFtw {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $True, Position = 0, ValueFromPipeline)] [MyClass] $myObj
    )
    'Success!'
}

DuckTypingFtw $input

Run Code Online (Sandbox Code Playgroud)

不幸的是Success!,我得到的不是:

DuckTypingFtw:无法处理参数“myObj”的参数转换。无法将值“@{PropA=propA;AdditionalProp=additionalProp}”转换为类型“MyClass”。错误:“无法转换”@{PropA=propA; “AdditionalProp=additionalProp}”
类型“System.Management.Automation.PSCustomObject”的值要键入“MyClass”。在 C:\temp\tmp.ps1:23 字符:15 + DuckTypingFtw $input + ~~~~~~ + CategoryInfo : InvalidData: (:) [DuckTypingFtw], ParameterBindingArgumentTransformationException + ExcellentQualifiedErrorId : ParameterArgumentTransformationError,DuckTypingFtw

如果我注释掉AdditionalProp,一切正常。

基本上,我想要实现的目标是从一个函数返回一个对象并将其传递给第二个函数,同时确保第二个函数的参数具有所有预期的属性。

powershell pscustomobject powershell-5.0

5
推荐指数
1
解决办法
1747
查看次数

在PSCustomObject中打印项目

我想逐行打印自定义对象中的所有项目.我用过的陈述是:

TestObject ([PSCustomObject]@{item1=1 ;item2=2; item3=3},[PSCustomObject]@{item1=4;item2=5;item3=6}) -Verbose
Run Code Online (Sandbox Code Playgroud)

我的功能定义如下:

function TestObject
{
  [CmdLetBinding()]
  Param(
  [parameter(Mandatory=$True]
  [object[]]$objectNames
  )
  Begin{}
  Process
  {
    foreach ($object in $objectNames)
    {
      $myItems =@()
      $myItems += $object
      foreach ($o in $myItems.GetEnumerator())
      {
         Write-Verbose "---------------$o--------------"
         foreach ($i in $o)
         {
           Write-Verbose "Name:$i.Key Value:$i.Value"
         }
      }
      Write-Verbose "$object"
    }
  }
  End{}
}
Run Code Online (Sandbox Code Playgroud)

我期望输出如下:

VERBOSE: ---------------@{item1=1; item2=2; item3=3}--------------
VERBOSE: Name:item1 Value:1
VERBOSE: Name:item2 Value:2
VERBOSE: Name:item3 Value:3
VERBOSE: @{item1=1; item2=2; item3=3}
VERBOSE: ---------------@{item1=4; item2=5; item3=6}--------------
VERBOSE: Name:item1 Value:4
VERBOSE: Name:item2 Value:5
VERBOSE: …
Run Code Online (Sandbox Code Playgroud)

powershell

0
推荐指数
1
解决办法
1198
查看次数