web-dev-qa-db-ja.com

Powershell:ファイルがロックされているかどうかを確認する

展開の自動化に問題があります。サービスを停止した後もファイルがロックされており、削除できません。私は本当に「通常は機能する」何かを作るためにスリープでハッキングを始めたくありません。ロックされたファイルの問題を適切に解決するための良い方法はありますか?おそらくある種の「ファイルが削除可能になるまで待つ」:

Get-ChildItem:パス 'D:\ MyDirectory \'へのアクセスが拒否されました。

この場合、「Test-Path」は十分ではありません。フォルダーが存在し、アクセス権があるためです。

19
Dech

最初の質問の下でこのソリューションへのリンクを投稿した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
  }
}

次に、タイムアウト付きの「待機」関数を追加します。

ご協力いただきありがとうございます!

31
Dech

私はこれを使います:

try { [IO.File]::OpenWrite($file).close();$true }
catch {$false}
20
mjolinor
$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
2
Basati Naveen