Powershell 创建新对象PSObject时出错
此powershell脚本在csv文件中最多占用8行,并通过复制列,然后保存在结果文件中(第一个结果文件保存得很好),将它们合并为一行。如果csv中有16行,则意味着保存第二个结果文件等 e、 g.在rows.csv中: 第一个字段第二个字段第三个字段第四个字段 球拍俱乐部 橙香蕉芒果梨 在result1.csv中: 第一个第二个第三个第四个第一个第二个第三个第四个 球拍俱乐部橙色香蕉芒果梨 我得到一个错误:Powershell 创建新对象PSObject时出错,powershell,csv,Powershell,Csv,此powershell脚本在csv文件中最多占用8行,并通过复制列,然后保存在结果文件中(第一个结果文件保存得很好),将它们合并为一行。如果csv中有16行,则意味着保存第二个结果文件等 e、 g.在rows.csv中: 第一个字段第二个字段第三个字段第四个字段 球拍俱乐部 橙香蕉芒果梨 在result1.csv中: 第一个第二个第三个第四个第一个第二个第三个第四个 球拍俱乐部橙色香蕉芒果梨 我得到一个错误: New-Object : Cannot convert 'System.Object[
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
(有序)哈希表(PowerShell中的$detailsnew
哈希表的类型)原样分配给[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
(有序)哈希表(PowerShell中的$detailsnew
哈希表的类型)原样分配给[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
之间的联系的观点很好,不明显;我更新了答案,以更好地反映我的快乐