Чи є спосіб отримати метадані файлів з командного рядка?


17

Чи є спосіб отримати метадані файлу з командного рядка в Windows XP і вище?

Зокрема, мені цікаво отримати інформацію, яку, як правило, можна побачити на вкладці "Деталі" діалогового вікна "Властивості" файлу в Windows 7 (вкладка "Версія" в XP.) Скріншоти обох нижче, щоб дати уявлення того, що я після.

Якщо можливо, я б краще це зробити через cmd.exeщось інше, що є стандартним для Windows XP SP3 і вище. Якщо це неможливо, моїми бажаними альтернативами будуть:

  • PowerShell
  • Утиліта SysInternals
  • Утиліта Nirsoft
  • Якийсь інший інструмент від подібного авторитетного і добре визнаного розробника.

Скріншот Windows XP:
Windows XP - вкладка Версія у Властивості файлу

Скріншот Windows 7:
Windows 7 - вкладка Деталі у Властивості файлу


1
Ви можете встановити FILEVERз компакт-диска Windows.
Вільям Джексон

1
@WilliamJackson - це звучить як можлива відповідь. Ви хочете розмістити його як одне ціле, а може, трохи розгорнути його з деякою інформацією, що міститься в цій статті KB? Також ви можете запропонувати щось для більш високих версій Windows? Я розумію з деяких пошуків, які FILEVERне містяться на цих компакт-дисках, і тому може бути не підтримуваним інструментом для цих версій.
Іссі

Відповіді:


18

Ви можете використовувати 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 soulution.
not2qubit

2

Те, що ви шукаєте, можна витягнути за допомогою комбінації dsofile.dll (не потрібно, якщо у вас встановлений Office) та autoit або будь-якої мови .NET.

Я також знайшов метод powerhell , але мені не вдалося його перевірити.

Я написав невеликий сценарій з 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 BRIEFабо LIST FULL.

Перевірте > wmic datafile list /?більш детальну інформацію.

Це рішення допомогло мені:
> wmic datafile "c:\\path\\to\\file.exe" list full

Примітка. Як зазначає @bobbymcr, не забудьте уникнути цього \, інакше це не вийде.


Це не працює ...
not2qubit

Вибачте, це не працює для вас. Я щойно спробував це знову, і це працює. Win7, права адміністратора. Повний шлях до файлу та "\".
S3DEV
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.