Есть ли способ получить метаданные файла из командной строки?

19

Есть ли способ получить метаданные файла из командной строки в Windows XP и выше?

В частности, я заинтересован в том, чтобы получить информацию, которую обычно можно увидеть на вкладке «Сведения» диалогового окна «Свойства» файла в Windows 7. (вкладка «Версия» в XP.) Ниже приведены снимки обоих экранов, чтобы дать представление о них. из того, что я после.

Если возможно, я бы предпочел сделать это через cmd.exeили что-то еще, что стандартно поставляется с Windows XP SP3 и выше. Если это невозможно, я бы предпочел:

  • PowerShell
  • Утилита SysInternals
  • Утилита Nirsoft
  • Некоторый другой инструмент от столь же уважаемого и общепризнанного разработчика.

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

Скриншот Windows 7:
Windows 7 - вкладка «Сведения» в свойствах файла

Iszi
источник
1
Вы можете установить FILEVERс компакт-диска Windows.
Уильям Джексон
1
@WilliamJackson - Это звучит как возможный ответ. Не могли бы вы опубликовать это как единое целое, и, может быть, немного дополнить его информацией, которая есть в этой статье базы знаний? Кроме того, не могли бы вы предложить что-то для более высоких версий Windows? Я понял из некоторых поисков, которые FILEVERне включены в эти компакт-диски, и поэтому не могут быть поддерживаемым инструментом для этих версий.
Изи

Ответы:

20

Вы можете использовать WMIC.exe, чтобы получить большую часть пути:

C: \> wmic datafile где Name = "C: \\ Windows \\ System32 \\ cmd.exe" получить производителя, имя, версию
Название производителя Версия
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Обратите внимание на обратную косую черту \в пути (иначе это не работает).

bobbymcr
источник
расширение этого метода для сравнения версий в пакете: 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.

Я также нашел метод powershell , но я не смог его протестировать.

Я написал небольшой скрипт с 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
MaQleod
источник
0

Просто чтобы расширить ответ @bobbymcr выше (который я нашел очень полезным, спасибо!); Вы можете упростить команду и расширить результаты с помощью параметров LIST BRIEFили LIST FULL.

Проверьте > wmic datafile list /?для более подробной информации.

Это решение помогло мне:
> wmic datafile "c:\\path\\to\\file.exe" list full

Примечание: как упомянуто @bobbymcr, не забывайте избегать \, иначе это не будет работать.

S3DEV
источник
Это не работает ...
not2qubit
Извините, это не работает для вас. Я только что попробовал это снова, и это работает. Win7, права админа. Полный путь к файлу и экранированный '\'.
S3DEV