Powershell - 检查文件是否已完成写入

4

我有一段PowerShell代码,作为给定文件夹路径上的文件监听器。监听器会启动一个命令行调用到另一个程序中打开并操作文件。

问题在于,如果将任何文件放入此文件夹中,PowerShell代码会立即启动命令行调用。如果文件非常大(比如100+ MB),那么当人们将文件复制到文件夹中时,文件可能仅完成5%的“写入”,此时命令函数就已经启动并尝试打开该文件(但失败了)。

在PowerShell中是否有一种方法可以检查文件是否仍在被写入?这样我就可以构建一个循环,每隔x秒检查一次,并且只有在写入完成后才运行一次?

如果文件正在被写入,它是否保持“锁定”状态?在PowerShell中是否可以检查这一点?

谢谢大家!

2个回答

6
可能在System.IO.FileInfo中有一个锁检查可用,或者类似的地方,但我使用一个简单的长度检查。 它应该放在被调用的脚本中而不是文件监视器脚本中。
$LastLength = 1
$NewLength = (Get-Item $FileName).length
while ($NewLength -ne $LastLength) {
   $LastLength = $NewLength
   Start-Sleep -Seconds 60
   $NewLength = (Get-Item $FileName).length
}

0

回答你的主要问题,即如何检查文件下载的状态,最简单的方法是检查文件的最后修改时间,看是否超过了5分钟(为了考虑网络延迟等因素)。 我有多个文件,所以下面的代码是在文件夹级别上,但是对于单个文件,你只需要更改路径就可以了。

#print a user feed back to see if downloading is completed
write-host "started downloading"
function status_checker() {
if (((get-date) - $lastWrite) -gt $timespan) {
    write-host "Downloading completed"
    break
} else {
    write-host "still downloading" (Get-Date)
}
}
#check every 10 seconds
while(1)
{
   status_checker
   # 5 minutes
   start-sleep -seconds 300
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接