gpt4 book ai didi

arrays - 如何从PowerShell中的数组中删除项目?

转载 作者:行者123 更新时间:2023-12-04 13:45:06 27 4
gpt4 key购买 nike

我正在使用Powershell 1.0从数组中删除一项。这是我的脚本:

param (
[string]$backupDir = $(throw "Please supply the directory to housekeep"),
[int]$maxAge = 30,
[switch]$NoRecurse,
[switch]$KeepDirectories
)

$days = $maxAge * -1

# do not delete directories with these values in the path
$exclusionList = Get-Content HousekeepBackupsExclusions.txt

if ($NoRecurse)
{
$filesToDelete = Get-ChildItem $backupDir | where-object {$_.PsIsContainer -ne $true -and $_.LastWriteTime -lt $(Get-Date).AddDays($days)}
}
else
{
$filesToDelete = Get-ChildItem $backupDir -Recurse | where-object {$_.PsIsContainer -ne $true -and $_.LastWriteTime -lt $(Get-Date).AddDays($days)}
}

foreach ($file in $filesToDelete)
{
# remove the file from the deleted list if it's an exclusion
foreach ($exclusion in $exclusionList)
{
"Testing to see if $exclusion is in " + $file.FullName
if ($file.FullName.Contains($exclusion)) {$filesToDelete.Remove($file); "FOUND ONE!"}
}
}

我意识到Powershell中的Get-ChildItem返回了System.Array类型。因此,在尝试使用Remove方法时出现此错误:
Method invocation failed because [System.Object[]] doesn't contain a method named 'Remove'.

我想做的是将$ filesToDelete转换为ArrayList,然后使用ArrayList.Remove删除项目。这是一个好主意还是我应该以某种方式直接将$ filesToDelete作为System.Array进行操作?

谢谢

最佳答案

最好的方法是使用Where-Object进行过滤并使用返回的数组。

您还可以使用@splat将多个参数传递给命令(V2中的新增功能)。如果您不能升级(并且您应该尽可能升级,则只需从Get-ChildItems收集输出(仅重复执行该命令),然后使用通用代码进行所有过滤即可)。

脚本的工作部分变为:

$moreArgs = @{}
if (-not $NoRecurse) {
$moreArgs["Recurse"] = $true
}

$filesToDelete = Get-ChildItem $BackupDir @moreArgs |
where-object {-not $_.PsIsContainer -and
$_.LastWriteTime -lt $(Get-Date).AddDays($days) -and
-not $_.FullName.Contains($exclusion)}

在PSH中,数组是不可变的,您无法对其进行修改,但是创建一个新数组非常容易(数组上的像 +=这样的运算符实际上会创建一个新数组并返回该数组)。

关于arrays - 如何从PowerShell中的数组中删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341166/

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