我正在编写一个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
}当我传递的$numberOfFoldersToKeep少于起始目录$parentFolderName中的文件夹数时,这种方法效果很好。例如,在我的目标文件夹中有5个子目录,这将按预期工作:
myScript.ps1 C:\StartingFolder 3但是,如果我要传递大量要跳过的文件夹,我的语句似乎会返回$parentFolderName本身的值!所以这是行不通的:
myScript.ps1 C:\StartingFolder 15因为跳过变量超过了Get-ChildItem集合中的项数,所以脚本尝试删除C:\StartingFolder\,这完全不是我所期望的。
我做错了什么?
发布于 2013-07-01 23:48:44
试试这个:
$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-02 00:12:27
我把答案归功于@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.在上面的注释中指出的,问题是如果您在PowerShell中将一个null集合传递到一个foreach语句中,则foreach语句的主体将被执行一次。
这对我来说是完全不直观的,因为我来自.NET背景。显然,这对许多其他人来说也是不直观的,因为在MSDN:https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=281908&SiteID=99上有针对这种行为的bug报告。
显然,此错误已在PowerShell V3中修复。
https://stackoverflow.com/questions/17407712
复制相似问题