Is there a way to get a file's metadata from the command line in Windows XP and above?

Particularly, I'm interested in getting the information one might normally see on the "Details" tab of a file's "Properties" dialog in Windows 7. ("Version" tab in XP.) Screenshots of both are below, to give an idea of what I'm after.

If possible, I'd rather do this through cmd.exe or something else that comes standard with Windows XP SP3 and above. If this is not possible, my preferred alternatives would be:

  • PowerShell
  • A SysInternals utility
  • A Nirsoft utility
  • Some other tool from a similarly reputable and well-recognized developer.

Windows XP screenshot:
Windows XP - Version tab in File Properties

Windows 7 screenshot:
Windows 7 - Details tab in File Properties

  • 1
    You can install FILEVER from the Windows CD. – William Jackson Dec 1 '11 at 3:45
  • 1
    @WilliamJackson - That sounds like a possible answer. Mind posting it as one, and maybe fleshing it out a bit with some of the info that's in that KB article? Also, could you suggest something for higher versions of Windows? I understand from some searching that FILEVER is not included on those CDs, and so may not be a supported tool for those versions. – Iszi Dec 1 '11 at 4:07
up vote 16 down vote accepted

You can use WMIC.exe to get most of the way there:

C:\>wmic datafile where Name="C:\\Windows\\System32\\cmd.exe" get Manufacturer,Name,Version
Manufacturer           Name                         Version
Microsoft Corporation  c:\windows\system32\cmd.exe  6.1.7601.17514

Note the escaping of the backslashes \ in the path (it does not work otherwise).

  • extension of this method to compare versions in a batch: superuser.com/a/904535/131936 – LogicDaemon Apr 22 '15 at 8:03
  • You can get just about any OS info you need for most operations through WMI but it comes with a major caveat; it's quite slow. Orders of magnitude slower than most of the more direct routes. That said, it does work for a lot of queries and monitoring. – kayleeFrye_onDeck Oct 17 '16 at 17:35
  • This give an error: wmic : Unexpected switch at this level. on W81, same for Iszi soulution. – not2qubit Mar 9 '17 at 8:25

What you are looking for can be pulled with a combination of dsofile.dll (not needed if you have Office installed) and autoit or any .NET language.

I also found a powershell method, but I haven't been able to test it.

I wrote up a little script with autoit that still needs some tweaking. I am on Vista and I can't get the few dsofile.dll calls to function as I would expect, though it still provides some output that you might be interested in. I'll work on this more in the morning when I have access to an XP and win7 VM. Note that you need to change the path in the dll functions to wherever you install 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

Just to expand on @bobbymcr 's answer above (which I found very helpful, thank you!); you can simplify the command and broaden the results by using the LIST BRIEF or LIST FULL options.

Check > wmic datafile list /? for more details.

This solution helped me:
> wmic datafile "c:\\path\\to\\file.exe" list full

Note: As mentioned by @bobbymcr, remember to escape the \, else it won't work.

  • This doesn't work... – not2qubit Mar 9 '17 at 8:21
  • Sorry this isn't working for you. I've just tried it again and it does work. Win7, admin rights. Full file path, and escaped '\'. – S3DEV Mar 21 at 12:16

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.