从不依赖于文件扩展名的 PowerScript 检查 Excel 文件格式

Check Excel file format from PowerScript not relying on file extension

我们有许多 Excel 文件以 .xlsx 或 .xlsm 格式存储。不幸的是,文件扩展名的最后一个字母在另一个 IT 系统中被删除,因此它们都具有文件扩展名 .xls。但我们也有 Excel 个以 .xls 格式存储的文件。

我需要编写一个 PowerShell 脚本来检测实际的 Excel 文件格式,然后重命名文件,以便它们的文件扩展名适合内容。我们有数以千计的此类文件,因此无法手动选择它。

我找到了有关如何区分 .xls 和较新的 XML 格式(如 .xlsx 和 .xlsm)的信息(通过检查文件中的第一个字符)。 但是我还没有找到任何关于如何确定它是 .xlsx 还是 .xlsm 的信息。

有什么想法吗?

我快速检查了 xlsxxlsm 文件的内容类型。 仅供参考,基本上 excel 文件是包含各种信息和内容的档案。

您可以解压缩两个文件并检查文件内容[Content_Types].xml

XLSX 有:

<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>

而 XLSM 有:

<Override PartName="/xl/workbook.xml" ContentType="application/vnd.ms-excel.sheet.macroEnabled.main+xml"/>

你可以从这里开始:)

我在检查 [Content_Types].xml 文件时注意到类似于 Grzegorz 的内容。当文件中有 vba 项目时,将存在以下条目

<Default
    Extension="bin"
    ContentType="application/vnd.ms-office.vbaProject"

这是我编写的一些简单代码,用于检查此条目是否存在

$excelFile = 'C:\temp\macro_workbook.xlsm'
$archive = Expand-Archive $excelFile -DestinationPath "c:\temp$(Split-Path $excelFile -LeafBase)" -PassThru -Force

$contentTypesFile = $archive | Where-Object name -EQ '[Content_Types].xml'
$xml = [xml](Get-Content -LiteralPath $contentTypesFile)

if ($xml.types.default.extension -contains 'bin') {
    Write-Host 'VBA project found - xlsm file'
}
else {
    Write-Host 'Not a VBA project'
}