【问题标题】:Powershell: Check if a file is lockedPowershell:检查文件是否被锁定
【发布时间】:2021-12-03 22:47:51
【问题描述】:

我在自动部署时遇到问题,在我停止服务后,文件仍然被锁定,我无法删除它。我真的不想开始用 sleep 来做一些“通常有效”的东西。有没有很好的方法来正确解决锁定文件的问题,也许是某种“等到文件可移动”:

Get-ChildItem : 拒绝访问路径“D:\MyDirectory\”。

'Test-Path' 在这种情况下是不够的,因为该文件夹都存在并且我可以访问它。

【问题讨论】:

标签: file powershell locking


【解决方案1】:

感谢 David Brabant 在最初的问题下发布了指向此解决方案的链接。看来我可以从以下功能开始:

function Test-FileLock {
  param (
    [parameter(Mandatory=$true)][string]$Path
  )

  $oFile = New-Object System.IO.FileInfo $Path

  if ((Test-Path -Path $Path) -eq $false) {
    return $false
  }

  try {
    $oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)

    if ($oStream) {
      $oStream.Close()
    }
    return $false
  } catch {
    # file is locked by a process.
    return $true
  }
}

然后添加一个带有超时的“等待直到”功能。

感谢您的帮助!

【讨论】:

  • 我试过这个,但它似乎不起作用,除非我向 Test-FileLock 添加一个写入输出语句,我做错了什么吗? ` If (Test-FileLock -path $file) { Write-Output "skipping locked file $File" } Else { $null = Move-Item -Path $file.FullName -Destination $dir_path\ } `
【解决方案2】:

我用这个:

try { [IO.File]::OpenWrite($file).close();$true }
catch {$false}

【讨论】:

  • 将 try/catch 作为一个合乎逻辑的 if/else 感觉很糟糕,但我想如果没有其他方法......
  • $file 应该是绝对路径,例如。 [IO.File]::OpenWrite((Resolve-Path $file).Path).close(),否则会默认到home目录,成为难以调试的逻辑错误。
  • 请注意,如果文件被锁定,则返回 false,而 @Dech 的答案如果文件被锁定,则返回 true。
【解决方案3】:
$fileName = "C:\000\Doc1.docx"
$file = New-Object -TypeName System.IO.FileInfo -ArgumentList $fileName
$ErrorActionPreference = "SilentlyContinue"
[System.IO.FileStream] $fs = $file.OpenWrite(); 
if (!$?) {
    $msg = "Can't open for write!"
}
else {
    $fs.Dispose()
    $msg = "Accessible for write!"
}
$msg

【讨论】:

    【解决方案4】:
    Function Confirm-FileInUse {
        Param (
            [parameter(Mandatory = $true)]
            [string]$filePath
        )
        try {
            $x = [System.IO.File]::Open($filePath, 'Open', 'Read')
            $x.Close()
            $x.Dispose()
            return $false
        }
        catch [System.Management.Automation.MethodException] {
            return $true
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多