Powershell文件锁定功能未打开excel文件

Posted

技术标签:

【中文标题】Powershell文件锁定功能未打开excel文件【英文标题】:Powershell File Lock function is not opening excel File 【发布时间】:2019-10-14 14:30:48 【问题描述】:

我编写了一个函数来检查共享网络驱动器中的另一个进程/用户是否正在使用/锁定 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】:

您必须在 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://***.com/questions/38419325/catching-full-exception-message
                    $formatstring = "0 : 1`n2`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

【讨论】:

嗨 Lloyd 感谢您提供正确的 try/catch 结构,但问题是文件 $Path 甚至没有在这一行中打开“ $FileStream = [System.IO.File]::Open($路径,'打开','写入')”。它直接跳转到 Catch[System.IO.IOException] 为什么路径是字符串数组?它不应该通过 $Path 找出每个单独的路径吗?

以上是关于Powershell文件锁定功能未打开excel文件的主要内容,如果未能解决你的问题,请参考以下文章

windows powershell实现excel的一些操作的代码

新人请教:导入excel提示未找到提供程序

批处理文件中的 Powershell:错误和命令未执行

VMware报错“原因: 未能锁定文件”,打开失败

Ace oledb连接关闭文件仍在使用中错误

powershell 查找锁定文件的进程