Loops 导出前检查文件是否正在使用

Loops 导出前检查文件是否正在使用,loops,powershell,Loops,Powershell,我正在编写一个脚本,将excel文件导出为PDF格式。不过,我让那个部分正常工作了,因为我保存在现有PDF的基础上,导出时它无法打开。我正在寻找一种让PowerShell检查文件当前是否打开的方法,如果是,请等待X秒,然后再次检查。如果没有,它可以继续 它目前的工作非常完美,如果PDF是开放的,它就会中断,但是我需要它来循环 以下是我目前掌握的情况: $path=“c:\users\XXXXX\documents” $xlFixedFormat=“Microsoft.Office.Interop

我正在编写一个脚本,将excel文件导出为PDF格式。不过,我让那个部分正常工作了,因为我保存在现有PDF的基础上,导出时它无法打开。我正在寻找一种让PowerShell检查文件当前是否打开的方法,如果是,请等待X秒,然后再次检查。如果没有,它可以继续

它目前的工作非常完美,如果PDF是开放的,它就会中断,但是我需要它来循环

以下是我目前掌握的情况:

$path=“c:\users\XXXXX\documents”
$xlFixedFormat=“Microsoft.Office.Interop.Excel.xlFixedFormatType”-作为[类型]
$excelFiles=Get ChildItem-Path$Path-Include spreadsheet.xlsx-Recurse
$File=“c:\users\XXXXX\documents\Exported.pdf”
试一试{
[IO.File]::OpenWrite($File.Close();
$true
}抓住{
打破
}
$objExcel=新对象-ComObject Excel.Application
$objExcel.Visible=$false
foreach($excelFiles中的wb){
$filepath=Join Path-Path$Path-ChildPath($wb.BaseName+“.pdf”)
$workbook=$objExcel.Workbooks.Open($wb.FullName,3)
$workbook.Saved=$true
“保存$filepath”
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF,$filepath)
$objExcel.Workbooks.Close()
}
$objExcel.Quit()

这应该是你想要的;感谢提供了测试文件锁定功能

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()
        }
        # file is unlocked.
        $false
    }
    catch
    {
      # file is locked by a process.
      return $true
    }
}

$path = "c:\users\XXXXX\documents" 
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type]
$excelFiles = Get-ChildItem -Path $path -Include spreadsheet.xlsx -Recurse 
$File = "c:\users\XXXXX\documents\Exported.pdf"

while((Test-FileLock $file) -eq $true)
{
    Start-Sleep -Seconds 3
}

$objExcel = New-Object -ComObject Excel.Application 
$objExcel.Visible = $false
foreach ($wb in $excelFiles) {
  $filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + ".pdf")
  $workbook = $objExcel.Workbooks.Open($wb.FullName, 3)
  $workbook.Saved = $true
  "saving $filepath"
  $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath)
  $objExcel.Workbooks.Close() 
}
$objExcel.Quit()

代码将检查文件锁定,如果检测到,请等待3秒钟,然后重试。一旦锁被清除,PDF导出代码将运行。

这应该是您想要的;感谢提供了测试文件锁定功能

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()
        }
        # file is unlocked.
        $false
    }
    catch
    {
      # file is locked by a process.
      return $true
    }
}

$path = "c:\users\XXXXX\documents" 
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type]
$excelFiles = Get-ChildItem -Path $path -Include spreadsheet.xlsx -Recurse 
$File = "c:\users\XXXXX\documents\Exported.pdf"

while((Test-FileLock $file) -eq $true)
{
    Start-Sleep -Seconds 3
}

$objExcel = New-Object -ComObject Excel.Application 
$objExcel.Visible = $false
foreach ($wb in $excelFiles) {
  $filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + ".pdf")
  $workbook = $objExcel.Workbooks.Open($wb.FullName, 3)
  $workbook.Saved = $true
  "saving $filepath"
  $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath)
  $objExcel.Workbooks.Close() 
}
$objExcel.Quit()
代码将检查文件锁定,如果检测到,请等待3秒钟,然后重试。一旦锁定被清除,PDF导出代码将运行