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