有没有办法从命令行获取文件元数据?


19

是否可以从Windows XP及更高版本的命令行中获取文件的元数据?

特别是,我感兴趣的是获取人们通常可以在Windows 7中的文件“属性”对话框的“详细信息”选项卡上看到的信息(在XP中为“版本”选项卡。)下面的两个屏幕快照均提供了一个概念我所追求的

如果可能的话,我宁愿通过cmd.exeWindows XP SP3及更高版本的标准配置来完成。如果这不可能,我的首选替代方法是:

  • 电源外壳
  • SysInternals实用程序
  • Nirsoft实用程序
  • 来自知名度和知名度较高的开发人员的其他工具。

Windows XP屏幕截图:
Windows XP-文件属性中的“版本”选项卡

Windows 7屏幕截图:
Windows 7-文件属性中的“详细信息”选项卡


1
您可以FILEVER从Windows CD 安装。
威廉·杰克逊

1
@WilliamJackson-听起来像是一个可能的答案。介意将其发布为一个,也许可以将该知识库文章中的一些信息充实一下?另外,您能为更高版本的Windows建议些什么吗?通过某些FILEVERCD上未包含的搜索,我了解到这些搜索可能并不支持这些版本。
Iszi 2011年

Answers:


20

您可以使用WMIC.exe来获取大部分信息:

C:\> wmic数据文件,其中Name =“ C:\\ Windows \\ System32 \\ cmd.exe”获得制造商,名称,版本
制造商名称版本
Microsoft Corporation c:\ windows \ system32 \ cmd.exe 6.1.7601.17514

请注意\路径中反斜杠的转义(否则将不起作用)。


此方法的扩展以批量比较版本:superuser.com/a/904535/131936
LogicDaemon

你可以只是你需要通过WMI大部分操作,但它与一个任何操作系统信息主要告诫; 这很慢。比大多数更直接的路线要慢几个数量级。也就是说,它确实适用于许多查询和监视。
kayleeFrye_onDeck

这给出了一个错误:wmic : Unexpected switch at this level.在W81上,与Iszi解决方案相同。
not2qubit

2

可以使用dsofile.dll(如果已安装Office则不需要)和autoit或任何.NET语言的组合拉动您要查找的内容。

我还找到了一个powershell方法,但是我无法对其进行测试。

我用autoit编写了一个小脚本,仍然需要进行一些调整。我在Vista上,无法像我期望的那样获得几个dsofile.dll调用,尽管它仍然提供了一些您可能感兴趣的输出。我将在早上可以访问时进行更多工作到XP和win7 VM。请注意,您需要将dll函数中的路径更改为安装dsofile.dll的位置。

#include <file.au3>
Dim $file, $objFile, $Path, $encoding, $attrib, $attributes, $dt, $stamp, $szDrive, $szDir, $szFName, $szExt

If $CmdLine[0] = 0 Then
    ConsoleWrite("You must specify a file")
Else
    $file = $CmdLine[1]
    If FileExists($file) Then
        _DLLstartup()
        $objFile = ObjCreate("DSOFile.OleDocumentProperties")
        If Not IsObj($objFile) Then Exit
        $objFile.Open(FileGetLongName($file))
        $Path = _PathSplit($file, $szDrive, $szDir, $szFName, $szExt)
        ConsoleWrite("Filename: " & $Path[3] & $Path[4] & @CRLF)
        ConsoleWrite("Size: " & FileGetSize($file) & " bytes" & @CRLF)
        ConsoleWrite("Version: " & FileGetVersion($file) & @CRLF)
        ConsoleWrite("Company: " & $objFile.SummaryProperties.Company & @CRLF)
        ConsoleWrite("Author: " & $objFile.SummaryProperties.Author & @CRLF)
        $encoding = FileGetEncoding($file)
            Select
            Case $encoding = 0
                $encoding = "ANSI"
            Case $encoding = 32
                $encoding = "UTF16 Little Endian"
            Case $encoding = 64
                $encoding = "UTF16 Big Endian"
            Case $encoding = 128
                $encoding = "UTF8 (with BOM)"
            Case $encoding = 256
                $encoding = "UTF8 (without BOM)"
            EndSelect
        ConsoleWrite("Encoding: " & $encoding & @CRLF)
        $attrib = FileGetAttrib($file)
        $attributes = ""
            If StringInStr($attrib, "R") <> 0 Then
                $attributes = $attributes & " READONLY"
            EndIf
            If StringInStr($attrib, "A") <> 0 Then
                $attributes = $attributes & " ARCHIVE"
            EndIf
            If StringInStr($attrib, "S") <> 0 Then
                $attributes = $attributes & " SYSTEM"
            EndIf
            If StringInStr($attrib, "H") <> 0 Then
                $attributes = $attributes & " HIDDEN"
            EndIf
            If StringInStr($attrib, "N") <> 0 Then
                $attributes = $attributes & " NORMAL"
            EndIf
            If StringInStr($attrib, "D") <> 0 Then
                $attributes = $attributes & " DIRECTORY"
            EndIf
            If StringInStr($attrib, "O") <> 0 Then
                $attributes = $attributes & " OFFLINE"
            EndIf
            If StringInStr($attrib, "C") <> 0 Then
                $attributes = $attributes & " COMPRESSED"
            EndIf
            If StringInStr($attrib, "T") <> 0 Then
                $attributes = $attributes & " TEMPORARY"
            EndIf
        ConsoleWrite("Attributes:" & $attributes & @CRLF)
        $dt = FileGetTime($file, 1)
        $stamp = $dt[0] & "-" & $dt[1] & "-" & $dt[2] & " " & $dt[3] & ":" & $dt[4] & ":" & $dt[5]
        ConsoleWrite("Created: " & $stamp & @CRLF)
        $dt = FileGetTime($file, 0)
        $stamp = $dt[0] & "-" & $dt[1] & "-" & $dt[2] & " " & $dt[3] & ":" & $dt[4] & ":" & $dt[5]
        ConsoleWrite("Accessed: " & $stamp & @CRLF)
        $dt = FileGetTime($file, 2)
        $stamp = $dt[0] & "-" & $dt[1] & "-" & $dt[2] & " " & $dt[3] & ":" & $dt[4] & ":" & $dt[5]
        ConsoleWrite("Modified: " & $stamp & @CRLF)
        ConsoleWrite("Short Name: " & FileGetShortName($file, 1) & @CRLF)
        ConsoleWrite("Long Name: " & FileGetLongName($file, 1))
        $objFile.Close
        _DLLshutdown()
    Else
        ConsoleWrite("Can't find file")
    EndIf
EndIf

Func _DLLstartup($DLLpath = '')  ;borrowed from Andrew Goulart
    If $DLLpath = Default Or $DLLpath = '' Then $DLLpath = "C:\DsoFile\dsofile.dll";@ScriptDir & '\dsofile.dll'
    ShellExecuteWait('regsvr32', '/s /i ' & $DLLpath, @WindowsDir, 'open', @SW_HIDE)
EndFunc

Func _DLLshutdown($DLLpath = '') ;borrowed from Andrew Goulart
    If $DLLpath = Default Or $DLLpath = '' Then $DLLpath = "C:\DsoFile\dsofile.dll";@ScriptDir & '\dsofile.dll'
    ShellExecuteWait('regsvr32', ' /s /u ' & $DLLpath, @WindowsDir, 'open', @SW_HIDE)
EndFunc

0

只是为了扩展上述@bobbymcr的答案(我发现这很有帮助,谢谢!);您可以使用LIST BRIEFLIST FULL选项简化命令并扩大结果。

检查> wmic datafile list /?更多细节。

该解决方案帮助我:
> wmic datafile "c:\\path\\to\\file.exe" list full

注意:如@bobbymcr所述,请记住转义\,否则它将不起作用。


这行不通...
not2qubit

抱歉,这不适合您。我刚刚再次尝试过,它确实起作用。Win7,管理员权限。完整的文件路径,并转义为'\'。
S3DEV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.