删除目录,无论是否超过260个字符的限制

55

我正在编写一个简单的脚本,在特定天数后删除USMT迁移文件夹:

## Server List ##
$servers = "Delorean","Adelaide","Brisbane","Melbourne","Newcastle","Perth"

## Number of days (-3 is over three days ago) ##
$days = -3

$timelimit = (Get-Date).AddDays($days)

foreach ($server in $servers)
{
    $deletedusers = @()
    $folders = Get-ChildItem \\$server\USMT$ | where {$_.psiscontainer}
    write-host "Checking server : " $server
    foreach ($folder in $folders) 
    {
        If ($folder.LastWriteTime -lt $timelimit -And $folder -ne $null)
        {
            $deletedusers += $folder
            Remove-Item -recurse -force $folder.fullname
        }
    }
        write-host "Users deleted : " $deletedusers
        write-host
}

然而,我一直在遇到可怕的错误提示:Remove-Item : 指定的路径、文件名或两者都太长。完全限定的文件名必须少于 260 个字符,目录名必须少于 248 个字符。

我一直在寻找解决方法和替代方案,但它们都围绕着我关心文件夹中有什么。

我希望有一个更简单的解决方案,因为如果文件夹被标记为删除,我并不真正关心其中内容。

除了 Remove-Item -recurse 之外,是否有其他本地PowerShell cmdlet可以实现我想要的功能?

17个回答

2

最好使用多种工具的组合,尝试使用dir /x命令获取8.3文件名。然后您可以将该输出解析到文本文件中,然后构建一个PowerShell脚本来删除您输出到文件中的路径。只需要花费一分钟即可完成。或者,您可以将8.3文件名重命名为较短的名称,然后再删除。


1

PowerShell可以轻松地与AlphaFS.dll一起使用,以执行实际的文件I/O操作,而不会遇到“路径过长”的问题。

例如:

Import-Module <path-to-AlphaFS.dll>

[Alphaleonis.Win32.Filesystem.Directory]::Delete($path, $True)

请查看 Codeplex:https://alphafs.codeplex.com/,了解此 .NET 项目。

1
这已经有点老了,但最近我不得不再次解决它。最终我使用了 'subst',因为它不需要任何其他模块或函数在运行此命令的 PC 上可用。更具可移植性。
基本上找到一个空闲的驱动器号,将长路径映射到该驱动器号,然后将其用作 GCI 的基础。
唯一的限制是 $_.fullname 和其他属性将报告驱动器号作为根路径。
似乎可以正常工作:
$location = \\path\to\long\
$driveLetter = ls function:[d-z]: -n | ?{ !(test-path $_) } | random

subst $driveLetter $location
sleep 1
Push-Location $driveLetter -ErrorAction SilentlyContinue
Get-ChildItem -Recurse

subst $driveLetter /D

那个命令显然不是用来删除文件的,但可以被替换。

1
我在尝试删除远程机器上的文件夹时遇到了同样的问题。没有什么帮助,但是我找到了一个技巧:
# 1:let's create an empty folder
md ".\Empty" -erroraction silentlycontinue

# 2: let's MIR to the folder to delete : this will empty the folder completely.
robocopy ".\Empty" $foldertodelete /MIR /LOG+:$logname 

# 3: let's delete the empty folder now:
remove-item $foldertodelete -force

# 4: we can delete now the empty folder
remove-item ".\Empty" -force

在本地或远程文件夹上(使用UNC路径)运行得像魔法一样。

0

0

在Daniel Lee的解决方案基础上,如果$myDir中间有空格,则会出现FILE NOT FOUND错误,因为文件集从空格中分隔。为了克服这个问题,请在变量周围使用引号并放置powershell转义字符以跳过引号。

PS>cmd.exe /C "rmdir /s /q <重音符号>"$myDir<重音符号>""

请使用适当的重音符号替换<重音符号>
SO与我开玩笑,我无法添加它:)希望有人会更新它以便其他人易于理解。


0

只是为了完整性,我遇到过这个问题几次,并在不同情况下使用了“subst”和“New-PSDrive”的组合来解决它。

虽然不是一个确切的解决方案,但如果有人正在寻找替代方法,这可能会有所帮助。

Subst似乎对于你用来访问文件的程序类型非常敏感,有时候它有效,有时候则无效,New-PSDrive也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接