【问题标题】:Force close files that are in use when the script runs脚本运行时强制关闭正在使用的文件
【发布时间】:2014-08-02 12:57:29
【问题描述】:

我有以下脚本可以获取早于指定日期的文件并将它们作为存档保存在不同的文件夹中。该脚本适用于大多数文件,但对于某些文件,它会出现此错误并且不会将这些文件包含在存档中。

Move-Item : The process cannot access the file because it is being used by another process.
At C:\SRS\SRSLogArchieveScript.ps1:49 char:13
+             Move-Item <<<<  $item.FullName $destPathController -force;
    + CategoryInfo          : WriteError: (C:\SRS\Controll...apter0611-1.log:FileInfo) [Move-Item], IOException
    + FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

但是我将-force-move item 一起使用,但它仍然存在这个问题。有没有办法可以强制关闭所有正在使用的文件,以确保所有文件都包含在存档中。

try
{
foreach( $item in (Get-ChildItem $sourcePath -recurse | Where-Object { $_.CreationTime -le $archiveTillDate }) )
{
$item.FullName;
Move-Item $item.FullName $destPath -force;
}
}
catch
{
$_.Exception.Message;
}
Finally
{
#Executing Zip Command to Archieve:
& $pathTo7ZipExe $arguments;

#Delete temporary log archieve directory
Remove-Item $logArchieve -recurse;

}

【问题讨论】:

  • 您可以使用Handle.exe 来识别正在使用该文件的进程。然后你可以杀死这个进程。你的意思是覆盖文件当它被锁定时,我认为这是不可能的。

标签: powershell powershell-2.0 windows-server-2008-r2


【解决方案1】:

此行为是设计使然。考虑保持打开文件的原始应用程序尝试写入它。如果您“窃取”了基础文件,会发生什么?从崩溃到意外行为的任何事情。为了防止这种事情发生,所有现代操作系统都禁止非特权用户进行这种操作。

话虽如此,您可以使用Sysinternals' Handle.exe 之类的工具来检查文件是否已打开句柄。如果您有足够的权限,相同的工具可以关闭句柄。

另一个解决方案是尝试和open the file 具有读写访问权限。这将允许您过滤掉保留的文件 - 假设在您释放自己的锁定后没有进程将打开文件。唯一可以确定的方法是将文件内容复制到存档位置,同时获得排他写锁并最终删除文件。

【讨论】:

  • 这是 Windows 独有的“功能”,是各种形式的系统损坏的实际原因。这绝对不是“现代操作系统”中的做法——Linux 以不同的方式处理文件锁定。
  • @Argo 我不明白为什么讨论非 Windows 系统上的文件锁定与 三年前发布的 Powershell 问题相关。 请通过添加对源的引用来改进您的评论支持系统损坏的声明以及锁定在 Linux 中的工作方式。到目前为止,这只是道听途说。
  • 你的错误断言有多老并不重要。重要的是它是错误的,我希望看到它按照社区准则进行修复。至于文件锁定,你可以在这里开始查找实现细节:en.m.wikipedia.org/wiki/File_locking
  • “应用程序中不正确的错误处理可能导致文件被锁定(使用“共享”访问或字节范围文件锁定)并且无法被其他应用程序访问的情况” - 一项可追溯到旧版操作系统的功能,可能会影响 Windows 上的某些操作,例如一系列应用程序的简单设置。
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多