强制关闭脚本运行时正在使用的文件

时间:2014-06-12 09:02:17

标签: powershell powershell-v2.0 windows-server-2008-r2

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

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;

}

1 个答案:

答案 0 :(得分:-2)

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

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

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