Powershell:检查文件是否被锁定

Dec*_*ech 17 powershell locking file

我有一个自动化部署的问题,在我停止服务后仍然锁定文件,我无法删除它.我真的不想开始用睡眠来制作"通常有效"的东西.有没有一种方法可以正确解决锁定文件的问题,也许是某种"等到文件可以删除":

Get-ChildItem:拒绝访问路径'D:\ MyDirectory \'.

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

Dec*_*ech 28

感谢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
  }
}
Run Code Online (Sandbox Code Playgroud)

然后添加一个'wait until'函数并超时.

谢谢你的帮助!


mjo*_*nor 18

我用这个:

try { [IO.File]::OpenWrite($file).close();$true }
catch {$false}
Run Code Online (Sandbox Code Playgroud)

  • `$ file`应该是绝对路径,例如.`[IO.File] :: OpenWrite((Resolve-Path $ file).Path).close()`,否则它将默认为主目录并成为一个难以调试的逻辑错误. (3认同)
  • 尝试/捕获作为逻辑上的if / else很讨厌,但是我想是否还有其他方法... (2认同)
  • 请注意,如果文件被锁定,则返回false,而如果文件被锁定,则@Dech的答案返回true。 (2认同)