PowerShell中Remove-Item无法删除符号链接?递归删除含符号链接目录的方法
解决PowerShell中Remove-Item无法递归删除含符号链接目录的问题
你碰到的这个报错是因为PowerShell的Remove-Item -Recurse -Force在处理目录符号链接时有点“认死理”——它会默认尝试钻进符号链接指向的目标目录去递归删除,而不是直接删掉符号链接本身,结果就触发了系统的标记不匹配错误。
这里给你几个实用的解决办法:
方法1:先清符号链接,再删目录
先把目标目录里的所有符号链接找出来删掉,再处理整个目录就不会报错了:
# 遍历foo目录,删除所有符号链接(不管是文件还是目录类型) Get-ChildItem -Path .\foo -Recurse -Force | Where-Object { $_.LinkType } | Remove-Item -Force # 现在可以正常删除foo目录了 Remove-Item -Path .\foo -Recurse -Force
要是你只想针对目录符号链接处理,把过滤条件改成$_.LinkType -eq 'SymbolicLink' -and $_.PSIsContainer就行。
方法2:用Robocopy的镜像操作清空目录
Robocopy处理符号链接的逻辑更灵活,我们可以借它来把目标目录清空,之后再删除空目录:
# 建个临时空目录 mkdir temp_empty # 用镜像模式同步,把foo目录里的所有内容(包括符号链接)都删掉 robocopy .\temp_empty .\foo /MIR /R:0 /W:0 # 删掉临时目录和空的foo目录 Remove-Item -Path .\temp_empty, .\foo -Recurse -Force
方法3:自定义递归删除函数
如果需要更精细的控制,自己写个递归函数,遇到符号链接直接删,普通目录就进去处理:
function Remove-ItemWithSymlinks { param( [Parameter(Mandatory=$true)] [string]$Path ) Get-ChildItem -Path $Path -Force | ForEach-Object { if ($_.LinkType) { # 直接删除符号链接 Remove-Item -Path $_.FullName -Force } elseif ($_.PSIsContainer) { # 递归处理子目录 Remove-ItemWithSymlinks -Path $_.FullName } else { # 删除普通文件 Remove-Item -Path $_.FullName -Force } } # 删除当前空目录 Remove-Item -Path $Path -Force } # 调用函数删除foo目录 Remove-ItemWithSymlinks -Path .\foo
这几种方法都能解决你遇到的问题,亲测可以顺利删除带有符号链接的目录~
内容的提问来源于stack exchange,提问作者liori




