File Powershell:检查文件是否已锁定

File Powershell:检查文件是否已锁定,file,powershell,locking,File,Powershell,Locking,我在自动部署时遇到问题,在我停止服务后,文件上仍然有一个锁,我无法删除它。我真的不想为了做一些“通常有效”的东西而在睡梦中胡闹。是否有一种好方法可以正确解决锁定文件的问题,可能是某种“等到文件可移动”的方式: Get-ChildItem:对路径“D:\MyDirectory\”的访问被拒绝 在这种情况下,“测试路径”是不够的,因为文件夹都存在,我可以访问它。感谢David Brabant,他在初始问题下发布了此解决方案的链接。似乎我可以通过以下功能开始执行此操作: function Test-F

我在自动部署时遇到问题,在我停止服务后,文件上仍然有一个锁,我无法删除它。我真的不想为了做一些“通常有效”的东西而在睡梦中胡闹。是否有一种好方法可以正确解决锁定文件的问题,可能是某种“等到文件可移动”的方式:

Get-ChildItem:对路径“D:\MyDirectory\”的访问被拒绝


在这种情况下,“测试路径”是不够的,因为文件夹都存在,我可以访问它。

感谢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
  }
}
然后添加一个带有超时的“等待”函数

谢谢你的帮助

我用这个:

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

作为逻辑if/else的try/catch感觉很糟糕,但我想如果没有其他方法…
$file
应该是一个绝对路径,例如
[IO.file]::OpenWrite((Resolve path$file.path).close()
,否则它将默认为主目录并成为难以调试的逻辑错误。请注意,如果文件被锁定,则返回false,如果文件被锁定,@Dech的答案将返回true。我尝试了这个方法,但除非我添加一个write-output语句来测试FileLock,否则它似乎不起作用,我是否做错了什么If(testfilelock-path$file){Write Output“跳过锁定的文件$file”}Else{$null=Move Item-path$file.FullName-Destination$dir\u path\}`
$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