【问题标题】:Remove-Item error: Cannot remove item [item path & name]: Access to the path '[item path & name]' is denied删除项目错误:无法删除项目 [项目路径和名称]:访问路径“[项目路径和名称]”被拒绝
【发布时间】:2014-05-21 07:29:48
【问题描述】:

我是 PowerShell 新手。

我正在尝试自动将 dll 组件从源服务器上的文件夹部署到目标服务器上的多个文件夹。这看起来应该很简单:将组件从源服务器上的源(部署)文件夹复制到目标服务器上的文件夹,验证副本,最后从源服务器上的部署文件夹中删除组件。

将文件从源服务器复制到目标服务器没有问题。 但是,当脚本继续从源服务器中删除组件时,我会间歇性地遇到错误: “删除项目错误:无法删除项目 [项目路径和名称]:访问路径“[项目路径和名称]”被拒绝。”

我已经多次运行这个脚本;有时它会毫无问题地完成,有时会出现错误。并非每个要删除的文件都会发生该错误,并且似乎每次出现时都会在不同的组件上发生。

下面是我写的删除组件和验证删除的函数:

function DeleteSourceFiles($srcPath) {
    # Announce delete
    OutputToHostAndLog ("Files will be removed from "+$srcPath+"...")
    OutputToHostAndLog "Removing files..."

    # Deletes all file items (i.e. all except folders) in source folder
    $filesToDelete=Get-ChildItem $srcPath | Where-Object {$_ -is [IO.FileInfo]}
    ForEach($item in $filesToDelete) {
        Remove-Item $srcPath\$item -force

        # Verify deletions       
        if(Test-Path($srcPath+"\"+$item)) {
            OutputToHostAndLog ("Delete failed: "+$item.Name)        
            $fail++
        }
        else {
            OutputToHostAndLog ($item.Name+" deleted successfully...")
        }
    }
 }

在 Remove-Item cmdlet 中使用 -force 参数似乎对该问题没有任何影响。这些文件(同样,每次失败的不同文件)似乎都不是 isReadOnly 。

同样,以管理员身份运行 PowerShell 似乎没有任何效果,尽管源文件夹的 Get-Acl 表明管理员应该拥有 FullControl。

这是我缺少的权限问题吗? 任何建议都非常感谢...

编辑: 我因此更新了我的脚本:

function DeleteSourceFiles($srcPath) {
    # Announce delete
    OutputToHostAndLog ("Files will be removed from "+$srcPath+"...")
    OutputToHostAndLog "Removing files..."
    OutputToHostAndLog $gap

    # Delete all file items (i.e. all except folders) in source folder
    $filesToDelete=Get-ChildItem $srcPath | Where-Object {$_ -is [IO.FileInfo]} | ForEach {
        Remove-Item $_.FullName -Force

        # Verify deletions
        if(Test-Path($srcPath+"\"+$_)) {
            OutputToHostAndLog ("Delete failed: "+$_.Name)        
            $fail++
        }
        else {
            OutputToHostAndLog ($_.Name+" deleted successfully...")
        }
    }
}

这似乎可以正常工作,尽管我仍然不确定为什么这种安排会产生不同的结果。为了学习,任何见解都将不胜感激......

【问题讨论】:

  • 我有一个类似的错误(PSv3)。我有一种预感,是脚本本身在维护锁定。您的原始脚本将文件存储在变量中(创建锁?)。第二个在存储到变量之前删除文件。我很难重新安排我的脚本来证明这一点。

标签: powershell powershell-2.0 powershell-ise


【解决方案1】:

间歇性访问被拒绝错误可能表明您尝试删除的一个或多个文件已被另一个应用程序锁定。当您尝试清理日志目录时,这是一个非常常见的问题。

我建议做的唯一一件事就是等待带有锁的应用程序释放文件。

【讨论】:

  • 我曾考虑过相关文件可能被另一个应用程序使用的可能性,但是,尽管这些文件是实际应用程序 .dll 的副本,但我在每台服务器上创建了测试文件夹以进行脚本测试。这不是意味着这些副本无法使用吗?
  • 这肯定意味着它们没有被使用。您是说脚本的更新版本没有任何问题吗?
  • 到目前为止,杰森很好。似乎奇怪的是,稍微改变句法结构,当原始出现间歇性错误时,脚本似乎可以始终如一地运行。
  • 谢谢!我的文件被暂停的谷歌驱动器锁定,告诉我我的权限被拒绝,即使是管理员,所以我开始挖掘权限等。完成红鲱鱼,我只需要杀死谷歌驱动器。你为我节省了很多时间。
  • 等待应用程序锁释放文件似乎很失败
【解决方案2】:

我通过将用户的安全权限设置为为我试图从中删除的文件夹添加“修改”和“完全控制”来解决此问题

【讨论】:

    【解决方案3】:

    我在计划任务中运行 PowerShell 时遇到了这个问题。我做了几件事,最后一件也奏效了:

    1. 让用户完全控制文件夹中的文件。

    2. 让我的小组成为校长

      a) 例如New-ScheduledTaskPrincipal -GroupId "BUILTIN\Administrators" -RunLevel Highest

    3. 将任务设置为使用最高权限:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多