Czy istnieje sposób na uzyskanie metadanych pliku z wiersza poleceń?

19

Czy istnieje sposób na uzyskanie metadanych pliku z wiersza polecenia w systemie Windows XP i nowszych?

W szczególności jestem zainteresowany uzyskaniem informacji, które normalnie można zobaczyć na karcie „Szczegóły” w oknie dialogowym „Właściwości” pliku w systemie Windows 7. (karta „Wersja” w XP). Poniżej podano zrzuty ekranowe obu z nich. o co mi chodzi.

Jeśli to możliwe, wolę to zrobić za pomocą cmd.execzegoś innego niż system Windows XP SP3 i nowszy. Jeśli nie jest to możliwe, moimi preferowanymi alternatywami byłyby:

  • PowerShell
  • Narzędzie SysInternals
  • Narzędzie Nirsoft
  • Inne narzędzie znanego i uznanego programisty.

Zrzut ekranu systemu Windows XP:
Windows XP - karta Wersja we właściwościach pliku

Zrzut ekranu systemu Windows 7:
Windows 7 - karta Szczegóły we właściwościach pliku

Iszi
źródło
1
Możesz zainstalować FILEVERz dysku CD systemu Windows.
William Jackson,
1
@WilliamJackson - To brzmi jak możliwa odpowiedź. Zastanawiasz się nad opublikowaniem go jako jednego, a może trochę go wzbogacisz o niektóre informacje zawarte w tym artykule z bazy wiedzy? Czy możesz również zasugerować coś dla wyższych wersji systemu Windows? Rozumiem z niektórych wyszukiwań, które FILEVERnie są zawarte na tych płytach CD, więc mogą nie być obsługiwanym narzędziem dla tych wersji.
Iszi

Odpowiedzi:

20

Możesz użyć WMIC.exe, aby uzyskać dostęp do większości sposobów:

C: \> plik danych wmic gdzie Nazwa = "C: \\ Windows \\ System32 \\ cmd.exe" pobierz Producent, nazwa, wersja
Wersja nazwy producenta
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Zwróć uwagę na ucieczkę ukośników odwrotnych \na ścieżce (inaczej nie działa).

Bobbymcr
źródło
rozszerzenie tej metody w celu porównania wersji w partii: superuser.com/a/904535/131936
LogicDaemon
Możesz uzyskać prawie wszystkie informacje o systemie operacyjnym potrzebne do większości operacji za pośrednictwem WMI, ale wiąże się to z dużym zastrzeżeniem; jest dość wolny. O rząd wielkości wolniejszy niż większość bardziej bezpośrednich tras. To powiedziawszy, działa na wiele zapytań i monitorowania.
kayleeFrye_onDeck
Daje to błąd: wmic : Unexpected switch at this level.na W81, to samo dla Iszi soulution.
not2qubit
2

To, czego szukasz, można wyciągnąć za pomocą kombinacji dsofile.dll (niepotrzebne, jeśli masz zainstalowany pakiet Office) i autoit lub w dowolnym języku .NET.

Znalazłem również PowerShell metodę , ale nie byłem w stanie jej przetestować.

Napisałem mały skrypt z autoitem, który wciąż wymaga poprawek. Korzystam z systemu Vista i nie mogę uzyskać kilku wywołań dsofile.dll, które działałyby tak, jakbym się tego spodziewał, chociaż nadal zapewnia dane wyjściowe, które mogą Cię zainteresować. Popracuję nad tym rano, kiedy będę mieć dostęp. do XP i Win7 VM. Zauważ, że musisz zmienić ścieżkę w funkcjach dll na miejsce instalacji 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
źródło
0

Wystarczy rozwinąć powyższą odpowiedź @bobbymcr (która okazała się bardzo pomocna, dziękuję!); możesz uprościć polecenie i rozszerzyć wyniki za pomocą LIST BRIEFlubLIST FULL opcji .

Sprawdź > wmic datafile list /?więcej szczegółów.

To rozwiązanie pomogło mi:
> wmic datafile "c:\\path\\to\\file.exe" list full

Uwaga: Jak wspomniała @bobbymcr, pamiętaj, aby uciec \, bo inaczej to nie zadziała.

S3DEV
źródło
To nie działa ...
not2qubit
Przepraszamy, to nie działa dla Ciebie. Właśnie spróbowałem ponownie i działa. Win7, prawa administratora. Pełna ścieżka do pliku i znak zmiany znaczenia „\”.
S3DEV,