从不依赖于文件扩展名的 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 的信息。
有什么想法吗?
我快速检查了 xlsx
和 xlsm
文件的内容类型。
仅供参考,基本上 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'
}
我们有许多 Excel 文件以 .xlsx 或 .xlsm 格式存储。不幸的是,文件扩展名的最后一个字母在另一个 IT 系统中被删除,因此它们都具有文件扩展名 .xls。但我们也有 Excel 个以 .xls 格式存储的文件。
我需要编写一个 PowerShell 脚本来检测实际的 Excel 文件格式,然后重命名文件,以便它们的文件扩展名适合内容。我们有数以千计的此类文件,因此无法手动选择它。
我找到了有关如何区分 .xls 和较新的 XML 格式(如 .xlsx 和 .xlsm)的信息(通过检查文件中的第一个字符)。 但是我还没有找到任何关于如何确定它是 .xlsx 还是 .xlsm 的信息。
有什么想法吗?
我快速检查了 xlsx
和 xlsm
文件的内容类型。
仅供参考,基本上 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'
}