Powershell 创建新对象PSObject时出错

Powershell 创建新对象PSObject时出错,powershell,csv,Powershell,Csv,此powershell脚本在csv文件中最多占用8行,并通过复制列,然后保存在结果文件中(第一个结果文件保存得很好),将它们合并为一行。如果csv中有16行,则意味着保存第二个结果文件等 e、 g.在rows.csv中: 第一个字段第二个字段第三个字段第四个字段 球拍俱乐部 橙香蕉芒果梨 在result1.csv中: 第一个第二个第三个第四个第一个第二个第三个第四个 球拍俱乐部橙色香蕉芒果梨 我得到一个错误: New-Object : Cannot convert 'System.Object[

此powershell脚本在csv文件中最多占用8行,并通过复制列,然后保存在结果文件中(第一个结果文件保存得很好),将它们合并为一行。如果csv中有16行,则意味着保存第二个结果文件等

e、 g.在rows.csv中:

第一个字段第二个字段第三个字段第四个字段

球拍俱乐部

橙香蕉芒果梨

在result1.csv中:

第一个第二个第三个第四个第一个第二个第三个第四个

球拍俱乐部橙色香蕉芒果梨

我得到一个错误:

New-Object : Cannot convert 'System.Object[]' to the type 'System.Collections.IDictionary' required by parameter 'Property'. Specified method is not supported.
At C:csv.ps1:19 char:42
+ $results = New-Object PSObject -Property $details
+                                          ~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-Object], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.NewObjectCommand
请注意,第16行的第一个新对象创建工作正常。在Powershell ISE中,如果我重新运行脚本,第16行也会出错。我不知道这里出了什么问题,但假设我需要在保存每个csv文件后销毁PSObject

$csvObjects = import-csv C:\rows.csv
$results = @()
$counter=1
foreach ($item in $csvObjects){
    $detailsnew = [ordered] @{            
        "first$counter" = $item.'First_field'          
        "second$counter" = $item.'Second_field'           
        "third$counter"  = $item.'Third_field'
        "fourth$counter" = $item.'Fourth_field'
    }   
    $details  +=  $detailsnew 
    # modulus comparison returns remainder - write out file every 8
    if ($counter % 8 -eq 0) {
        if ($counter -eq 8) {
            #works on line below on first run but fails on subsequent runs within Powershell ISE
            $results = New-Object PSObject -Property $details 
        }

        if ($counter -eq 16) {
            # fails on line below
            $results2 = New-Object PSObject -Property $details
        }

        $quotient = $counter / 8
        $results | export-csv -Path c:\result"$quotient".csv -noType
        $details = @()
        $results = @()
    }                     
    $counter++           
}
#write out final file if number not divisible by 8
if (-not($counter % 8 -eq 0)) {
    $results += New-Object PSObjectF -Property $details
    $modulo = $counter % 8
    $quotient_plus1 = (($counter-$modulo) / 8) +1
    $results | export-csv -Path C:\result"$quotient_plus1".csv -noType 
}
tl;dr

  • $details=@()
    应该是
    $details=[ordered]@{}

  • 要使ISE的重复执行按预期工作,请在循环之前放置另一条
    $details=[ordered]@{}
    语句


  • 在第一次循环迭代中,
    $details
    最初未定义,
    $details+=$detailsnew
    $detailsnew
    (有序)哈希表(PowerShell中的
    [ordered]@{…}
    哈希表的类型)原样分配给
    $details
    (也就是说,在
    $details
    未定义的情况下,
    +=
    的有效行为与
    =
    相同)

  • 在接下来的7次迭代中创建的
    $detailsnew
    哈希表随后由
    +=
    合并到已存储在
    $details
    中的哈希表中

  • 在第8次迭代之后,您错误地(重新)将
    $details
    初始化为数组(
    @()
    ),这就是问题的根源:随后使用
    +=
    将一个新数组元素添加到
    $details
    中,而不是合并哈希表条目,并传递一个数组而不是哈希表(或实现的任何字典类型)到
    新对象的
    -Property
    参数,然后(可预见地)失败

    • 相反,(重新)将
      $details
      初始化为有序哈希表:
      $details=[ordered]@{}

在Powershell ISE中,如果我重新运行脚本,第16行也会出错

PowerShell ISE点源于它运行的脚本,这意味着以前调用的变量可能会停留

作为一个旁白:这个<强>同样适用于< /强> ITS,您应该考虑迁移到[1 ]。 但是,您可以选择创建一个新的临时会话,如本部分底部所述

在您的情况下,这意味着当您在ISE中重新执行脚本时,
$details
在第一次迭代中已经是一个数组


[1] PowerShell ISE为和(底部部分)。

tl;dr

  • $details=@()
    应该是
    $details=[ordered]@{}

  • 要使ISE的重复执行按预期工作,请在循环之前放置另一条
    $details=[ordered]@{}
    语句


  • 在第一次循环迭代中,
    $details
    最初未定义,
    $details+=$detailsnew
    $detailsnew
    (有序)哈希表(PowerShell中的
    [ordered]@{…}
    哈希表的类型)原样分配给
    $details
    (也就是说,在
    $details
    未定义的情况下,
    +=
    的有效行为与
    =
    相同)

  • 在接下来的7次迭代中创建的
    $detailsnew
    哈希表随后由
    +=
    合并到已存储在
    $details
    中的哈希表中

  • 在第8次迭代之后,您错误地(重新)将
    $details
    初始化为数组(
    @()
    ),这就是问题的根源:随后使用
    +=
    将一个新数组元素添加到
    $details
    中,而不是合并哈希表条目,并传递一个数组而不是哈希表(或实现的任何字典类型)到
    新对象的
    -Property
    参数,然后(可预见地)失败

    • 相反,(重新)将
      $details
      初始化为有序哈希表:
      $details=[ordered]@{}

在Powershell ISE中,如果我重新运行脚本,第16行也会出错

PowerShell ISE点源于它运行的脚本,这意味着以前调用的变量可能会停留

作为一个旁白:这个<强>同样适用于< /强> ITS,您应该考虑迁移到[1 ]。 但是,您可以选择创建一个新的临时会话,如本部分底部所述

在您的情况下,这意味着当您在ISE中重新执行脚本时,
$details
在第一次迭代中已经是一个数组



[1] PowerShell ISE为and(底部)。

问题是您正在获取[Ordered]列表并试图将其转换为PSObject。@ArcSet我尝试从脚本中删除[Ordered],但出现了相同的错误。我最初添加了[Ordered]要通过将类似字段放在一起来提高csv文件的可读性,谢谢问题是您正在获取[Ordered]列表并尝试将其转换为PSObject。@ArcSet我尝试从脚本中删除[Ordered],但出现了相同的错误。我最初添加了[Ordered]为了通过将相似的字段放在一起来提高csv文件的可读性,感谢我的荣幸,@dapa;关于(有序)哈希表和
IDictionary
之间的联系的观点很好,不明显;我更新了答案,以更好地反映我的快乐