Existe uma maneira de obter metadados de arquivos a partir da linha de comando?

17

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

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

Se possível, prefiro fazer isso por meio de cmd.exe ou qualquer outra coisa que seja padrão no Windows XP SP3 e superior. Se isso não for possível, minhas alternativas preferidas seriam:

  • PowerShell
  • Um utilitário SysInternals
  • Um utilitário da Nirsoft
  • Outra ferramenta de um desenvolvedor similarmente reconhecido e bem reconhecido.

Captura de tela do Windows XP:

CapturadeteladoWindows7:

    
por Iszi 01.12.2011 / 04:40

3 respostas

16

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

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

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

    
por 01.12.2011 / 06:44
2

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

Também encontrei um método powershell , mas não fui capaz de testá-lo.

Eu escrevi um pequeno script com autoit que ainda precisa de alguns ajustes. Estou no Vista e não consigo obter as poucas chamadas dsofile.dll para funcionar como seria de esperar, embora ainda forneça alguns resultados que você pode estar interessado em. Eu vou trabalhar nisso mais de manhã quando eu tenho acesso para um XP e win7 VM. Note que você precisa alterar o caminho nas funções dll para onde quer que você 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
    
por 02.12.2011 / 10:24
0

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

Verifique > wmic datafile list /? para mais detalhes.

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

Observação: Conforme mencionado por @bobbymcr, lembre-se de escapar do \ , senão não funcionará.

    
por 11.01.2017 / 12:46