Existe uma maneira de obter metadados de arquivo na linha de comando?

19

Existe uma maneira de obter os metadados de um arquivo na linha de comando no Windows XP e acima?

Particularmente, estou interessado em obter as informações que normalmente podemos ver na guia "Detalhes" da caixa de diálogo "Propriedades" de um arquivo no Windows 7. (guia "Versão" no XP.) do que eu estou procurando.

Se possível, eu prefiro fazer isso cmd.exeou algo mais que vem de fábrica com o Windows XP SP3 e superior. Se isso não for possível, minhas alternativas preferidas seriam:

  • PowerShell
  • Um utilitário SysInternals
  • Um utilitário Nirsoft
  • Alguma outra ferramenta de um desenvolvedor igualmente respeitável e bem reconhecido.

Captura de tela do Windows XP:
Windows XP - guia Versão em Propriedades do arquivo

Captura de tela do Windows 7:
Windows 7 - guia Detalhes em Propriedades do arquivo

Iszi
fonte
1
Você pode instalar a FILEVERpartir do CD do Windows.
William Jackson
1
@WilliamJackson - Isso soa como uma resposta possível. Importa-se de publicá-lo como um e talvez aprofundá-lo um pouco com algumas das informações contidas nesse artigo da KB? Além disso, você poderia sugerir algo para versões superiores do Windows? Pelo que entendi, algumas pesquisas FILEVERnão estão incluídas nesses CDs e, portanto, podem não ser uma ferramenta suportada para essas versões.
Iszi

Respostas:

20

Você pode usar o WMIC.exe para obter a maior parte do caminho até lá:

C: \> wmic datafile em que Nome = "C: \\ Windows \\ System32 \\ cmd.exe" obtém Fabricante, Nome, Versão
Nome do fabricante Versão
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Observe o escape das barras invertidas \no caminho (não funciona de outra forma).

bobbymcr
fonte
extensão deste método para comparar versões em um lote: superuser.com/a/904535/131936
LogicDaemon
Você pode obter praticamente todas as informações do sistema operacional necessárias para a maioria das operações através do WMI, mas ele vem com uma grande ressalva; é bem lento. Ordens de magnitude mais lentas que a maioria das rotas mais diretas. Dito isto, ele funciona para muitas consultas e monitoramento.
kayleeFrye_onDeck
Isso dá um erro: wmic : Unexpected switch at this level.no W81, o mesmo para o soulzi de Iszi.
Not2qubit 9/17/17
2

O que você está procurando pode ser extraído com uma combinação de dsofile.dll (não é necessário se você tiver o Office instalado) e a autoit ou qualquer linguagem .NET.

Eu também encontrei um método PowerShell , mas não pude testá-lo.

Eu escrevi um pequeno script com autoit que ainda precisa de alguns ajustes. Estou no Vista e não consigo fazer com que as poucas chamadas dsofile.dll funcionem como seria de esperar, embora ainda ofereça alguma saída na qual você possa estar interessado. Vou trabalhar nisso mais pela manhã quando tiver acesso para um XP e win7 VM. Observe que você precisa alterar o caminho nas funções DLL para onde quer que você instale o 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
fonte
0

Apenas para expandir a resposta de @bobbymcr acima (o que achei muito útil, obrigado!); você pode simplificar o comando e ampliar os resultados usando as opções LIST BRIEFou LIST FULL.

Verifique > wmic datafile list /?para mais detalhes.

Esta solução me ajudou a:
> wmic datafile "c:\\path\\to\\file.exe" list full

Nota: Como mencionado por @bobbymcr, lembre-se de escapar do \, caso contrário não funcionará.

S3DEV
fonte
Isso não funciona ...
not2qubit 9/17/17
Desculpe, isso não está funcionando para você. Eu apenas tentei novamente e funciona. Win7, direitos de administrador. Caminho completo do arquivo e escapou de '\'.
S3DEV 21/0318