gpt4 book ai didi

powershell - 创建新对象 PSObject 时出错

转载 作者:行者123 更新时间:2023-12-03 00:41:20 24 4
gpt4 key购买 nike

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

例如在 rows.csv 中:

第一场 第二场 第三场 第四场

Racket Racket 俱乐部

橙香蕉芒果梨

在 result1.csv 中:

第一1 第二1 第三1 第四1 第一2 第二2 第三2 第四2

球 bat Racket 俱乐部 橙色 香蕉 芒果 梨

我收到一个错误:

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;博士

  • $details = @()应该是 $details = [ordered] @{}
  • 要使 ISE 的重复执行也按预期工作,请放置另一个 $details = [ordered] @{}循环前的语句。


  • 在第一次循环迭代中,$details最初是未定义的,并且 $details += $detailsnew分配 $detailsnew (有序)哈希表(PowerShell 中的 [ordered] @{ ... } 哈希表是 System.Collections.Specialized.OrderedDictionary 类型)原样到 $details (也就是说,如果 $details 未定义,+= 的行为实际上与 = 相同)。
  • $detailsnew在接下来的 7 次迭代中创建的哈希表然后由 += 合并。进入已存储在 $details 中的哈希表.
  • 第 8 次迭代后,您错误地(重新)初始化了 $details作为数组( @() ),这是问题的根源:后续使用 +=然后添加一个新的数组元素到 $details而不是合并哈希表条目,而是将数组而不是哈希表(或任何实现 System.Collections.IDictionary 的字典类型)传递给 New-Object-Property然后参数 - 可以预见 - 失败。
  • 相反,(重新)初始化$details作为有序哈希表:$details = [ordered] @{}


  • In Powershell ISE if I rerun the script it errors on line 16 too.



    PowerShell ISE 点源它运行的脚本 ,这意味着 来自先前调用的变量可能会徘徊 .

    顺便说一句:这个 同样适用于 Visual Studio Code 及其 PowerShell extension ,您应该考虑迁移到[1]。
    但是,有 您可以选择创建一个新的临时 session ,如 this answer 的底部部分所述.

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

    [1] PowerShell ISE 是 no longer actively developedthere are reasons not to use it (底部)。

    关于powershell - 创建新对象 PSObject 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61189262/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com