2013-07-01 17 views
2

我正在编写一个PowerShell脚本,删除除最近X文件夹以外的所有文件夹,不包括名为Data的文件夹。我的发言来收集中删除文件夹看起来像这样:PowerShell 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 
} 

当我通过一个$numberOfFoldersToKeep比在起始目录$parentFolderName文件夹的数量少这个伟大的工程。例如,在我的目标文件夹5个子目录,这样按预期工作:

myScript.ps1 C:\StartingFolder 3 

但如果我通过大量的文件夹跳过的,我的发言似乎返回的$parentFolderName本身的价值!所以这是行不通的:

myScript.ps1 C:\StartingFolder 15 

因为跳过变量超过Get-ChildItem集合中的项目数量,脚本试图删除C:\StartingFolder\这是不是我所期待的。

我在做什么错?

+1

为什么不把你的foreach放在IF语句中:'if($ folder1 -neq $ null){...} ...'或者干脆用'remove-item $ objectItem.fullname' –

+0

我不能重现这个。如果我将'$ numberOfFoldersToKeep'传入的数字大于'gci'的结果,我会返回'​​$ null'(因此'foreach'甚至不会被执行),这是正是我期望的。 – alroc

+0

@alroc看看他如何删除文件;) –

回答

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 
    } 
    } 
+0

空测试非常重要!谢谢你的帮助。我不知道如果传递给foreach的collection是null,那么foreach的主体将被执行。 – dthrasher

+0

这是一个错误。阅读我的最后一条评论给你的问题。 –

1

我给@ C.B。我们可以通过使用@(...)语法将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语句的主体。

如C.B。在上述评论指出,问题是,如果你传递一个null收集到foreach语句在PowerShell中,一次执行foreach语句的身体。

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

显然,这个bug已经在PowerShell V3中修复了。