Powershell File Lock功能无法打开excel File

时间:2019-05-29 03:35:24

标签: powershell network-drive filelock

我编写了一个函数来检查共享网络驱动器中的另一个进程/用户是否正在使用/锁定一个excel文件,如果使用了该文件,请暂停该脚本并继续检查直到下一个操作可用为止将其移出文件夹。但是,当我使用System.IO读取文件时,它不会打开文件。我已经在本地驱动器上进行了测试,但这确实可以打开文件,但是在网络驱动器中不起作用吗?

$IsLocked = $True

Function Test-IsFileLocked {
    [cmdletbinding()]
    Param (
        [parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
        [Alias('FullName','PSPath')]
        [string[]]$Path
    )
    Process {      
           while($isLocked -eq $True){
            If ([System.IO.File]::Exists($Path)) {
                Try {
                    $FileStream = [System.IO.File]::Open($Path,'Open','Write')
                    $FileStream.Close()
                    $FileStream.Dispose()
                    $IsLocked = $False
                }  Catch {
                    $IsLocked = $True
                    echo "file in use, trying again in 10 secs.."
                    Start-Sleep -s 10

                }           
            }
          }     
     }
} 

这是代码无法拾取/打开我函数中的excel文件的地方

$FileStream = [System.IO.File]::Open($Path,'Open','Write')

程序在此处调用该函数。在网络驱动器中的某个项目文件夹中循环浏览,如果该项目与模式匹配,则将调用该函数以检查文件是否正在使用:

$DirectoryWithExcelFile = Get-ChildItem -Path "Z:\NetworkDriveFolder\"
$DestinationFolder = "Z:\DestinationFolder\"
$pattern = "abc"
foreach($file in $DirectoryWithExcelFile){

if($file.Name -match $pattern){
 Test-IsFileLocked -Path $file
 $destFolder = $DestinationFolder+$file.Name
 Move-item $file.FullName -destination $destFolder
     break
  }
}

1 个答案:

答案 0 :(得分:0)

您必须将close放入并放置在try的最后部分,因此,如果它抛出异常,则将其丢弃。不能保证它是文件锁定异常,因此最好是throw异常,捕获您期望的异常或write it out

$IsLocked = $True

Function Test-IsFileLocked {
    [cmdletbinding()]
    Param (
        [parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
        [Alias('FullName','PSPath')]
        [string]$Path
    )
    Process {      
           while($isLocked -eq $True){
            If ([System.IO.File]::Exists($Path)) {
                Try {
                    $FileStream = [System.IO.File]::Open($Path,'Open','Write')
                    $IsLocked = $False
                }  Catch [System.IO.IOException] {
                    $IsLocked = $True
                    echo "file in use, trying again in 10 secs.."
                    Start-Sleep -s 10

                } Catch {
                    # source https://stackoverflow.com/questions/38419325/catching-full-exception-message
                    $formatstring = "{0} : {1}`n{2}`n" +
                                    "    + CategoryInfo          : {3}`n" +
                                    "    + FullyQualifiedErrorId : {4}`n"
                    $fields = $_.InvocationInfo.MyCommand.Name,
                              $_.ErrorDetails.Message,
                              $_.InvocationInfo.PositionMessage,
                              $_.CategoryInfo.ToString(),
                              $_.FullyQualifiedErrorId

                    $formatstring -f $fields
                    write-output $formatstring

                } finally {
                    if($FileStream) {
                        $FileStream.Close()
                        $FileStream.Dispose()
                    }
                }           
            }
          }     
     }
} 

编辑: 路径应该是一个字符串,而不是字符串数组,除非您有多个路径,在这种情况下,应重命名为$Paths并遍历它们$Paths| % { $Path = $_; #do stuff here }