2

我正在编写一个 PowerShell 脚本,该脚本删除除 X 个最近的文件夹之外的所有文件夹,不包括名为 Data 的文件夹。我收集要删除的文件夹的声明如下所示:

$folders1 = Get-ChildItem $parentFolderName | 
     ? { $_.PSIsContainer -and $_.Name -ne "Data" } | 
     sort CreationTime -desc | 
     select -Skip $numberOfFoldersToKeep

foreach ($objItem in $folders1) {
    Write-Host $webServerLocation\$objItem
    Remove-Item -Recurse -Force $parentFolderName\$objItem -WhatIf
}

当我传递的 a$numberOfFoldersToKeep少于起始目录中的文件夹数时,这非常有用$parentFolderName。例如,在我的目标文件夹中有 5 个子目录,这可以按预期工作:

myScript.ps1 C:\StartingFolder 3

但是,如果我要跳过大量文件夹,我的语句似乎返回了$parentFolderName自身的值!所以这行不通:

myScript.ps1 C:\StartingFolder 15

因为 skip 变量超过了Get-ChildItem集合中的项目数,所以脚本会尝试删除C:\StartingFolder\这根本不是我所期望的。

我究竟做错了什么?

4

2 回答 2

2

尝试这个:

$folders1 = Get-ChildItem $parentFolderName | 
     ? { $_.PSIsContainer -and $_.Name -ne "Data" } | 
     sort CreationTime -desc | 
     select -Skip $numberOfFoldersToKeep
    if ($folder1 -neq $null)

{

foreach ($objItem in $folders1) {


        Write-Host $($objItem.fullname)




 Remove-Item -Recurse -Force $objItem.fullname -WhatIf
    }
    }
于 2013-07-01T15:48:43.797 回答
1

@( ... )我将@CB 归功于答案,但还有另一种解决问题的方法,即使用语法将 Get-ChildItem 的输出强制转换为数组。

$folders1 = @(Get-ChildItem $parentFolderName | 
     ? { $_.PSIsContainer -and $_.Name -ne "Data" } | 
     sort CreationTime -desc | 
     select -Skip $numberOfFoldersToKeep)

foreach ($objItem in $folders1) {
    Write-Host $webServerLocation\$objItem
    Remove-Item -Recurse -Force $parentFolderName\$objItem -WhatIf
}

这将返回一个长度为零的数组,因此不会执行 foreach 语句的主体。

正如 CB 在上面的评论中指出的那样,问题在于,如果您将null集合传递到 PowerShell 中的 foreach 语句中,则 foreach 语句的主体将执行一次

这对我来说完全不直观,来自 .NET 背景。显然,对于许多其他人来说,这也是不直观的,因为在 MSDN 上有针对这种行为的错误报告:https ://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99

显然,此错误已在 PowerShell V3 中修复。

于 2013-07-01T16:12:27.483 回答