PowerShell 1 - 检查文件是否已被使用

时间:2013-04-11 14:23:54

标签: windows powershell

我正在编写一个复制日志文件的脚本,我想确保在复制日志文件之前没有写入日志文件。

我创建了一个应该通过尝试打开文件来检查这种情况的函数。假设如果另一个应用程序打开了该文件,该函数将在$ oFile.Open调用中检测到这种情况。

我通过在记事本中打开测试文件来测试此功能,然后运行该功能并且它没有报告任何问题。换句话说,即使文件已在NotePad中打开,$ oFile.Open也返回true。

有人可以帮我理解这里发生了什么吗?

由于

function isFileLocked([string]$Path) {

 $oFile = New-Object System.IO.FileInfo $Path
 ### Make sure the path is good
 if ((Test-Path -Path $Path) -eq $false)
 {
  echo "Bad Path"
  return $false
 }
      #Try opening file
  $oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
  if ($oStream)
  {
    echo "Got valid stream so file must not be locked"
    $oStream.Close()

     return $false

  } else {
   echo "InValid stream so file is locked"
  return $true

  }
 }


  $file="C:\Users\Tom\Daily_Reviews_0001-1191.journal"
  $result = isFileLocked($file)
  echo $result

1 个答案:

答案 0 :(得分:2)

并非所有程序都持有文件句柄。记事本打开文件,读取其内容然后关闭它。因此,无法知道哪些程序可能打开文件,但这也意味着您不需要知道文件是否打开,只有在使用的句柄中,您的代码才会执行​​。