gpt4 book ai didi

powershell - 将数组列表从第一个脚本传递到第二个脚本

转载 作者:行者123 更新时间:2023-12-03 01:00:22 28 4
gpt4 key购买 nike

我需要将数组列表从脚本n.1传递到脚本n.2并用while周期进行修改
脚本n.1-PS-GetBak.ps1

[System.Collections.Arraylist]$ArrBkp=@()

$ArrObj = New-Object psobject -Property @{Type="Full";Id=1001}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Diff";Id=1002}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Full";Id=1003}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Diff";Id=1004}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Diff";Id=1005}
[void]$ArrBkp.Add($ArrObj)

$ArrBkp
脚本n.2-PS-Rest.ps1
[CmdletBinding()]Param(
[Parameter(ValueFromPipeline=$true)]
$ArrBkp,
[Parameter()]
$Id
)

$ArrBkp.Reverse()

foreach ($Bkp in $ArrBkp) {
while ($Bkp.Id -gt $Id) {$Bkp;$ArrBkp.Remove($Bkp)}
}

$ArrBkp
我期望的是:
PS C:\Users\dio\Documents\script\PS-Rest> .\PS-GetBak.ps1 | .\PS-Rest.ps1 -Id 1004
Id Type
-- ----
1004 Diff
1003 Full
1002 Diff
1001 Full
解释:while循环应从具有ID值gt 1004的arraylist中删除对象
实际结果:
仅将arraylist中的最后一个值通过管道传递到脚本n.2,从而导致while循环错误
In C:\Users\dio\Documents\script\PS-Rest\PS-Rest.ps1:11 car:49
+ while ($Bkp.Id -gt $Id) {$Bkp;$ArrBkp.Remove <<<< ($Bkp)}
+ CategoryInfo : InvalidOperation: (Remove:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

最佳答案

好的,我对其进行了重新设计,因此与原始版本非常接近。除了我通过属性名传递管道。我有点在子属性下走私arraylist。由于某种原因,PS脚本无法返回顶级数组列表。而且,管道无论如何一次只能处理一个元素。并收集要删除的元素,然后在第二个循环中删除。这样,它不会中断第一个循环。同样,使用while语句也没有意义,因为删除后条件永远不会改变。

ps-getbk.ps1:

[System.Collections.Arraylist]$ArrBkp=@()

$ArrObj = New-Object psobject -Property @{Type="Full";Id=1001}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Diff";Id=1002}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Full";Id=1003}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Diff";Id=1004}
[void]$ArrBkp.Add($ArrObj)

$ArrObj = New-Object psobject -Property @{Type="Diff";Id=1005}
[void]$ArrBkp.Add($ArrObj)

[pscustomobject]@{ArrBkp=$ArrBkp}

ps-rest.ps1:
[CmdletBinding()]Param(
[Parameter(ValueFromPipelineByPropertyName=$true)]
$ArrBkp,
[Parameter()]$Id
)

$ArrBkp.Reverse()

$dellist = foreach ($Bkp in $ArrBkp) {
if ($Bkp.Id -gt $Id) {$Bkp}
}

foreach ($Bkp in $dellist) {
$ArrBkp.remove($Bkp)
}

$ArrBkp
.\PS-GetBak.ps1 | .\PS-Rest.ps1 -Id 1004的输出
  Id Type
-- ----
1004 Diff
1003 Full
1002 Diff
1001 Full

关于powershell - 将数组列表从第一个脚本传递到第二个脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57340040/

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