Powershell: проверьте, заблокирован ли файл

У меня возникла проблема с автоматизацией развертывания, после того как я остановил службу, все еще есть блокировка файла, и я не могу ее удалить. Я действительно не хочу начинать взламывать сон, чтобы сделать что-то, что "обычно работает". Есть ли хороший способ правильно решить проблему заблокированных файлов, возможно, что-то вроде "ждать, пока файл не будет удален":

Get-ChildItem: доступ к пути "D:\MyDirectory" запрещен.

'Test-Path' недостаточно в этом случае, поскольку папка существует и у меня есть доступ к ней.

Ответ 1

Благодаря Дэвиду Брабанту, который разместил ссылку на это решение под первоначальным вопросом. Похоже, я могу сделать это, начав со следующей функции:

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
  }
}

Затем добавьте функцию ожидания до истечения времени ожидания.

Спасибо за вашу помощь!

Ответ 2

Я использую это:

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

Ответ 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