Есть ли способ получить метаданные файла из командной строки?
Есть ли способ получить метаданные файла из командной строки в Windows XP и выше?
В частности, я заинтересован в том, чтобы получить информацию, которую обычно можно увидеть на вкладке "Сведения" диалогового окна "Свойства" файла в Windows 7. (вкладка "Версия" в XP.) Ниже приведены снимки обоих экранов, чтобы дать представление о них. из того, что я после.
Если возможно, я бы предпочел сделать это через cmd.exe
или что-то еще, что стандартно поставляется с Windows XP SP3 и выше. Если это невозможно, я бы предпочел:
- PowerShell
- Утилита SysInternals
- Утилита Nirsoft
- Некоторый другой инструмент от столь же уважаемого и общепризнанного разработчика.
Скриншот Windows XP:
Скриншот Windows 7:
4 ответа
Вы можете использовать WMIC.exe, чтобы получить большую часть пути:
C: \> wmic datafile где Name="C:\\Windows\\System32\\cmd.exe" получить производителя, имя, версию Название производителя Версия Microsoft Corporation c:\windows\system32\cmd.exe 6.1.7601.17514
Обратите внимание на выход из обратной косой черты \
в пути (иначе это не работает).
Просто чтобы расширить ответ @bobbymcr выше (который я нашел очень полезным, спасибо!); Вы можете упростить команду и расширить результаты, используя LIST BRIEF
или же LIST FULL
опции.
Проверьте > wmic datafile list /?
Больше подробностей.
Это решение помогло мне:> wmic datafile "c:\\path\\to\\file.exe" list full
Примечание: как уже упоминалось @bobbymcr, не забывайте избегать \
иначе это не сработает.
То, что вы ищете, можно получить с помощью комбинации 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
Чтобы получить все метаданные:
wmic datafile where name="c:\\path\\to\\file.ext"
Чтобы просмотреть аккуратно в отдельных строках:
wmic datafile where name="c:\\path\\to\\file.ext" get /value