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

从不依赖文件扩展名的PowerScript中检查Excel文件格式,excel,powershell,file-format,Excel,Powershell,File Format,我们有许多Excel文件以.xlsx或.xlsm格式存储。不幸的是,文件扩展名的最后一个字母被另一个IT系统删除了,因此它们都具有.xls文件扩展名。但我们也有以.xls格式存储的Excel文件 我需要编写一个PowerShell脚本来检测实际的Excel文件格式,然后重命名这些文件,使它们的文件扩展名适合内容。我们有数千个这样的文件,所以它不是一个手动选项 我找到了有关如何区分.xls和较新的XML格式(如.xlsx和.xlsm)的信息(通过检查文件中的第一个字符)。但我还没有找到任何关于如何

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

我需要编写一个PowerShell脚本来检测实际的Excel文件格式,然后重命名这些文件,使它们的文件扩展名适合内容。我们有数千个这样的文件,所以它不是一个手动选项

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


有什么想法吗?

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

您可以做的是解压这两个文件并检查文件的内容
[content\u Types].xml

XLSX有:

而XLSM有:


从这一点开始,您可以继续:)

在检查
[Content\u Types].xml
文件时,我注意到一些类似于Grzegorz的东西。当文件中存在vba项目时,将存在以下条目

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

谢谢,这很有帮助!谢谢你,丹尼尔!我可能会首先尝试Grzegorz的解决方案,但我肯定会使用您的脚本片段作为基础。
$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'
}