代码之家  ›  专栏  ›  技术社区  ›  Lieven Keersmaekers

删除项无效,删除项有效

  •  7
  • Lieven Keersmaekers  · 技术社区  · 10 年前

    有人知道为什么吗 Remove-Item 将失败,而 Delete 作品


    在下面的脚本中,我得到了一个要删除的文件列表。
    使用 删除项目 我收到以下错误消息:

    VERBOSE:对目标执行“删除文件”操作 “\\UncPath\Folder\test.rtf”。删除项:无法删除项 \\UncPath\Folder\test.rtf:拒绝访问路径。

    但使用 删去 正在删除这些文件。

    剧本

    $files = gci \\UncPath\Folder| ?{ $_.LastWriteTime -le (Get-Date).addDays(-28) }
    
    # This doesn't work
    $files | Remove-Item -force -verbose
    
    # But this does
    $files | % { $_.Delete() }
    
    2 回复  |  直到 10 年前
        1
  •  9
  •   Loïc MICHEL    10 年前

    powershell对UNC路径的行为可能很奇怪,我认为它在UNC路径前面加上当前提供程序,您可以通过以下方式验证:

    cd c:
    test-path \\127.0.0.1\c$
    

    返回TRUE

    cd HKCU:
    test-path \\127.0.0.1\c$
    

    返回FALSE

    在指定完整路径时,我们告诉powershell使用 文件系统提供程序 ,这解决了问题。还可以指定提供程序,如 remove-item filesystem::\\uncpath\folder

        2
  •  4
  •   Keith Hill    10 年前

    我终于可以对这一点进行重新解释了,我认为这是一个错误。repo是要有一个像C$这样的开放共享,但要为文件上的用户设置拒绝修改权限。当我这样做时,我观察到:

    PS> gci '\\Keith-PC\C$\Users\Keith\foo.txt' | ri -for
    ri : Cannot remove item \\Keith-PC\C$\Users\Keith\foo.txt: Access to the path is denied.
    At line:1 char:43
    + gci '\\Keith-PC\C$\Users\Keith\foo.txt' | ri -for
    +                                           ~~~~~~~
        + CategoryInfo          : InvalidArgument: (\\Keith-PC\C$\Users\Keith\foo.txt:FileInfo) [Remove-Item], ArgumentExc
       eption
        + FullyQualifiedErrorId : RemoveFileSystemItemArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand
    
    PS> gci '\\Keith-PC\C$\Users\Keith\foo.txt' | %{$_.Delete()} # <== this works!
    

    我还观察到 -Force 参数也会删除文件而不会出错。拒绝权限仍然允许我从Windows资源管理器中删除文件,因此我认为应该删除该文件。那么,使用 -力 参数当我深入研究ErrorRecord时,我看到:

    Message        : Access to the path is denied.
    ParamName      :
    Data           : {}
    InnerException :
    TargetSite     : Void set_Attributes(System.IO.FileAttributes)
    StackTrace     :    at System.IO.FileSystemInfo.set_Attributes(FileAttributes value)
                        at Microsoft.PowerShell.Commands.FileSystemProvider.RemoveFileSystemItem(FileSystemInfo
                     fileSystemInfo, Boolean force)
    

    似乎 -力 参数正在尝试设置(更可能 重置 )属性和文件上的权限不允许这样做,例如:

    PS> gci '\\Keith-PC\C$\Users\Keith\foo.txt' | %{$_.Attributes = 'Normal'}
    Exception setting "Attributes": "Access to the path is denied."
    At line:1 char:45
    + gci '\\Keith-PC\C$\Users\Keith\foo.txt' | %{$_.Attributes = 'Normal'}
    +                                             ~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
        + FullyQualifiedErrorId : ExceptionWhenSetting
    

    因此,在我看来,PowerShell应该首先尝试 -力 不存在,如果失败,请尝试重置属性。