Powershell 中删除名称中包含括号 [ ] 的目录

Powershell 中删除名称中包含括号 [ ] 的目录

这是我第一次使用 Powershell,所以请对我宽容一点...

我编写了一个脚本来检查目录,如果目录里面的任何目录为空,则将其删除。我遇到的问题是目录名称中包含括号 -> [] 的目录。即使目录不为空,它仍会被删除。有人能帮忙吗?这是我使用的代码:

$path = "C:\path\to\directory"
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

我不完全理解上面的代码,我是在网上找到的。但它适用于没有括号的目录。

对于名为“夏日照片“包含文件,目录不会被删除。-> 好

对于空目录,它将被删除。-> 好

对于名为“夏季照片[2009]“,即使它包含文件,它也会被删除。-> 不好

我在 Google 上搜索并了解到 powershell 将括号视为通配符,但我不知道如何解决这个问题。如能得到任何帮助我将不胜感激。

谢谢!

答案1

  • 在 PowerShell Get-ChildItem 中[]表示一个范围,为避免这种情况,请不要-Path-LiteralPath内部使用Where-Object
  • 为了避免可能引起的烦恼,请$env:path选择不同的变量名。

$Mypath = "C:\path\to\directory"
Get-ChildItem -Path $Mypath -Recurse -Force | 
  Where-Object { $_.PSIsContainer -and (Get-ChildItem -LiteralPath $_.FullName -Recurse -Force | 
                                        Where-Object { !$_.PSIsContainer }) -eq $null } | 
    Remove-Item -Force -Recurse -Confirm

在较新的 PowerShell 版本中,您可以使用Get-ChildItem参数-Directoy,而-File不是Where {$_.PSIsContainer}

$Mypath = "C:\path\to\directory"
Get-ChildItem -Path $Mypath -Recurse -Force -Directory -EA 0 | 
  Where-Object { (Get-ChildItem -LiteralPath $_.FullName -Recurse -Force -File -EA 0 ) -eq $null } | 
    Remove-Item -Force -Recurse -Confirm

  • -EA 0-ErrorAction SilentlyContinue
  • 在测试时我建议在 Remove-Item cmdlet 中使用-WhatIf-Confirm

相关内容