这是我第一次使用 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