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