我有以下脚本,它们使用超过指定日期的文件并将其作为存档保存在其他文件夹中。该脚本适用于大多数文件,但对于某些文件,它会出现此错误,并且不会在归档中包含这些文件。
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;
}
答案 0 :(得分:-2)
此行为是设计使然。考虑保持打开文件的原始应用程序尝试写入它。如果你有偷窃&#34;基础文件,会发生什么?从崩溃到意外行为的任何事情。为了防止这种情况,所有现代操作系统都会阻止非特权用户进行此类操作。
话虽如此,您可以使用Sysinternals' Handle.exe
之类的工具来检查文件是否已打开句柄。如果您有足够的权限,相同的工具可以关闭句柄。
另一个解决方案是尝试open the file具有读写访问权限。这将允许您过滤掉保留的文件 - 假设在您释放自己的锁之后没有进程打开文件。唯一可以确定的方法是将文件内容复制到存档位置,并获得独占写锁定,最后删除文件。