使用PowerShell的文件锁定机制

问题描述

我有两个从同一文件读取的进程。我想确保这两个进程不会同时运行。我的方法是,当一个进程启动时,它应该寻找一个文件(process.txt)。如果该文件不存在,它将创建文件并继续执行,从两个进程之间的共享文件(sharedfile.txt)中读取。执行后,它将删除process.txt文件

由于两个进程都在执行后删除了process.txt文件,因此如果该文件存在,则应进入睡眠状态,直到另一个进程完成并删除文件

这里的问题是,当一个进程完成并删除文件(process.txt)时,即使没有文件存在,另一个进程也仍然停留在循环中而不执行。我不确定使用正确的循环。我尝试了其中的几个,但达不到我的目标。

Clear Host
$sleeptime = 15
$lockfile = "C:\Users\processid.txt"
$file = test-path -Path $lockfile
Try
{
if($file -eq 'True')
{
echo “Lock file found!”
echo "This means file is being used by another process"
echo "Wait for file to be deleted/released"
echo “Sleeping for $sleeptime seconds”
Start-Sleep $sleeptime -Verbose
}
else
{
    New-item -Path $lockfile
    #Executing a code here
}
    Remove-Item $lockfile –Force
}
}
Catch
{
Write-Host $_.Exception.Message`n
}

解决方法

您可以使用while循环

Clear Host
$sleeptime = 15
$lockfile = "C:\Users\processid.txt"

While(Test-Path -Path $lockfile)
{
    Write-Host "Lock file found!"
    Write-Host "This means file is being used by another process"
    Write-Host "Wait for file to be deleted/released"
    Write-Host "Sleeping for $sleeptime seconds"
    Start-Sleep $sleeptime -Verbose
}

try
{
    New-item -Path $lockfile
    #Executing a code here

    Remove-Item $lockfile –Force
}
catch
{
    Write-Host $_.Exception.Message`n
}
,

考虑这一点,它创建一个锁文件并打开它以进行独占访问。让我们运行脚本,然后进行清理。如果无法获得访问权限,则会等待5秒钟,然后重试。

在两个脚本中都使用此命令应使它们播放流畅并等待回合。如果由于某种原因留下了一个锁定文件(计划外重启会中止脚本或类似操作),那么该文件仍然可以正常工作。

  // these update normal
  dashT.startedCoaching = Date.now();
  dashT.lockedEmojiInteractionGroups = ['selectStudent'];
  dashT.studentQTicketID = qTicket.id;

  /** @type {[{value: import('../Models/Queue_Pool.js').QPE_Opts},{value: Message}]} */
  const [{ value: queuePoolEntry },{ value: answer }] = await Promise.allSettled([
    Queue_PoolEntry.findOne({ id: qTicket.id }),qTicket.coach.send(studentMessage(qTicket)),updateAllDashboards(),]);

  
  dashT.delMsgPool.push(answer.id);
  //dashT now has the id inside of delMsgPool
  console.log(POOLS);
  // POOLS.DashTicket_Pool[dashId].delMsgPool is still [] ... the other values are on the object 
  // though

您还可以更进一步,而是锁定实际使用的文件,但是由于文件对任何cmdlet都会被锁定,因此您需要从文件流中读取文件。