【问题标题】:Remove-Item (and [System.IO.File]::Delete() ) removes file that is in useRemove-Item (和 [System.IO.File]::Delete() )删除正在使用的文件
【发布时间】:2021-04-27 12:14:40
【问题描述】:

我正在编写一个脚本来清理 Autodesk 安装后留下的大量 GB 数据,但我收到一个错误消息,提示某些日志文件深埋在仍在使用的文件夹结构中。所以,我想得到$_.exception.GetType().fullname 这样我就可以有一个do/while 循环,只要那是失败就循环。或者更有可能循环直到成功或指定次数的尝试失败。 为此,我在 C 盘上创建了一个 RTF 文件,在写字板中打开它并尝试使用此代码获取异常信息。

$path = 'C:\New folder\New Rich Text Document.rtf'
try {
    Remove-Item $path -errorAction Stop
} catch {
    Write-Host "$($_.exception.GetType().fullname)"
    Write-Host "$($_.exception.message)"
}

净结果,没有 -Force 标志,文件即使在打开时也被删除。我认为这真的不应该发生。这只是像微软从来没有费心用写字板实现文件锁定的愚蠢吗?还是我不明白这种行为有什么好的理由?更重要的是,有没有办法触发这个条件,这样我就可以真正编写和测试一些优雅响应的代码?理想情况下不使用 MS Office 等,因为我没有它。操作系统附带的东西将是理想的。 我找到了this 使用 PowerShell 执行此操作的方法,因此我可以运行第二个脚本来锁定文件并在释放它之前循环一段时间,只要该时间小于我的删除超时时间,它就会工作。但似乎我应该能够,只需打开文件。虽然我现在发现导致问题的文件是一个日志文件,所以它很可能是通过一种更像该链接的机制锁定的,而不是实际上是“打开的”。但在我看来,打开的文件仍然应该是可删除的。

另外,如标题所述,我也尝试了[System.IO.File]::Delete($path),令我惊讶的是,它也删除了。越来越好奇。

【问题讨论】:

  • 看起来写字板在打开文件时并没有锁定文件,这与 Word 不同,它应该为您提供您所寻求的异常。
  • @Theo 你是如何验证的?有没有办法查看什么有文件锁?我想也许微软的免费工具只完成了一半,我可能需要 MS Office,这不会发生。所以我使用了单独的脚本方法。但是很高兴了解如何验证 WHAT 有锁,我猜你做了什么。

标签: powershell delete-file file-in-use


【解决方案1】:

某些应用程序在打开文件时不会像 MS Word 那样锁定文件。但是写字板没有,因此可以在写字板中打开文件时将其删除..

为了测试文件锁,我使用了一个小的帮助函数:

function Test-LockedFile {
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('FullName', 'FilePath')]
        [ValidateScript({Test-Path $_ -PathType Leaf})]
        [string]$Path
    )
    $file = [System.IO.FileInfo]::new($Path)
    # old PowerShell versions use:
    # $file = New-Object System.IO.FileInfo $Path

    try {
        $stream = $file.Open([System.IO.FileMode]::OpenOrCreate,
                             [System.IO.FileAccess]::Write,
                             [System.IO.FileShare]::Delete)  # in this case for deletion
        if ($stream) { $stream.Close() }
        return $false
    }
    catch {
        return $true
    }
}

现在如果我在 MS Word 中打开一个文件并测试该文件

Test-LockedFile 'D:\Test\blah.rtf'

返回True

当我在写字板中打开同一个文件时,测试结果为False

确定文件是否被锁定的另一种方法是尝试更改该文件的扩展名(或任何文件属性)。如果在锁定应用程序中打开,则不能这样做,但在写字板中打开时,没问题..

【讨论】:

  • 哈!要查看文件是否被锁定,请尝试锁定它。如此明显,事后看来。 :)
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多