【问题标题】:File Lock Mechanism using PowerShell使用 PowerShell 的文件锁定机制
【发布时间】:2020-12-22 21:31:29
【问题描述】:

我有两个从同一个文件读取的进程。我想确保这两个进程不会同时运行。我的方法是,当一个进程启动时,它应该寻找一个文件(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
}

【问题讨论】:

    标签: windows powershell automation


    【解决方案1】:

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

    对这两个脚本都使用它应该会让它们玩得很好并等待轮到它们。如果由于某种原因留下了一个锁定文件(计划外重启导致脚本中止或类似情况),这个文件仍然可以正常工作。

    $LockFile = 'C:\temp\test.lock'
    
    # Loop that runs until we have exclusive write access to $LockFile
    while ($FileStream.CanWrite -eq $false) {
        if (-not (Test-Path -Path $LockFile)) {
            Set-Content -Path $LockFile -Value 'Lockfile'
        }
        try {
            $FileStream = [System.IO.File]::Open("C:\temp\test.lock",'Open','Write')
        }
        catch {
            'Waiting 5 seconds'
            Start-Sleep -Seconds 5
        }
    }
    
    # ---
    # Your actual script here
    # ---
    
    # Cleanup
    $FileStream.Close()
    $FileStream.Dispose()
    Remove-Item -Path $LockFile -Force
    

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

    【讨论】:

      【解决方案2】:

      你可以使用这样的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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多