¿Hay alguna manera de obtener metadatos de archivo desde la línea de comandos?

19

¿Hay alguna manera de obtener los metadatos de un archivo desde la línea de comandos en Windows XP y superior?

Particularmente, estoy interesado en obtener la información que normalmente se puede ver en la pestaña "Detalles" del cuadro de diálogo "Propiedades" de un archivo en Windows 7. (pestaña "Versión" en XP). A continuación se muestran capturas de pantalla de ambos, para dar una idea de lo que busco

Si es posible, prefiero hacer esto cmd.exeo algo más que viene de serie con Windows XP SP3 y superior. Si esto no es posible, mis alternativas preferidas serían:

  • Potencia Shell
  • Una utilidad SysInternals
  • Una utilidad de Nirsoft
  • Alguna otra herramienta de un desarrollador igualmente reconocido y de buena reputación.

Captura de pantalla de Windows XP:
Windows XP: pestaña Versión en Propiedades del archivo

Captura de pantalla de Windows 7:
Windows 7: pestaña Detalles en Propiedades del archivo

Iszi
fuente
1
Puede instalar FILEVERdesde el CD de Windows.
William Jackson
1
@WilliamJackson - Eso suena como una posible respuesta. ¿Le importaría publicarlo como uno, y tal vez desarrollarlo un poco con algo de la información que está en ese artículo de KB? Además, ¿podría sugerir algo para versiones superiores de Windows? Entiendo por algunas búsquedas que FILEVERno están incluidas en esos CD, por lo que puede no ser una herramienta compatible para esas versiones.
Iszi

Respuestas:

20

Puede usar WMIC.exe para obtener la mayor parte del camino:

C: \> wmic datafile donde Name = "C: \\ Windows \\ System32 \\ cmd.exe" obtiene Fabricante, Nombre, Versión
Nombre del fabricante Versión
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Tenga en cuenta el escape de las barras diagonales inversas \en la ruta (de lo contrario no funciona).

bobbymcr
fuente
extensión de este método para comparar las versiones en un lote: superuser.com/a/904535/131936
LogicDaemon
Puede obtener casi cualquier información de sistema operativo que necesite para la mayoría de las operaciones a través de WMI, pero viene con una advertencia importante ; Es bastante lento. Órdenes de magnitud más lentas que la mayoría de las rutas más directas. Dicho esto, funciona para muchas consultas y monitoreo.
kayleeFrye_onDeck
Esto da un error: wmic : Unexpected switch at this level.en W81, lo mismo para Iszi soulution.
not2qubit
2

Lo que está buscando se puede obtener con una combinación de dsofile.dll (no es necesario si tiene instalado Office) y autoit o cualquier lenguaje .NET.

También encontré un método de PowerShell , pero no he podido probarlo.

Escribí un pequeño script con autoit que todavía necesita algunos ajustes. Estoy en Vista y no puedo hacer que las pocas llamadas a dsofile.dll funcionen como es de esperar, aunque todavía proporciona algunos resultados que podrían interesarle. Trabajaré en esto más por la mañana cuando tenga acceso a un XP y win7 VM. Tenga en cuenta que necesita cambiar la ruta en las funciones dll a donde sea que instale 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
MaQleod
fuente
0

Solo para ampliar la respuesta de @bobbymcr anterior (que me pareció muy útil, ¡gracias!); puede simplificar el comando y ampliar los resultados utilizando las opciones LIST BRIEFo LIST FULL.

Consulte > wmic datafile list /?para más detalles.

Esta solución me ayudó a:
> wmic datafile "c:\\path\\to\\file.exe" list full

Nota: Como mencionó @bobbymcr, recuerde escapar del \, de lo contrario no funcionará.

S3DEV
fuente
Esto no funciona ...
not2qubit
Lo siento, esto no está funcionando para ti. Acabo de intentarlo de nuevo y funciona. Win7, derechos de administrador. Ruta de archivo completa, y escapó '\'.
S3DEV