Gibt es eine Möglichkeit, Dateimetadaten über die Befehlszeile abzurufen?

19

Gibt es eine Möglichkeit, die Metadaten einer Datei über die Befehlszeile in Windows XP und höher abzurufen?

Insbesondere bin ich daran interessiert, die Informationen zu erhalten, die normalerweise auf der Registerkarte "Details" des Dialogfelds "Eigenschaften" einer Datei in Windows 7 angezeigt werden von dem, wonach ich bin.

Wenn möglich, mache ich das lieber durch cmd.exeoder etwas anderes, das ab Windows XP SP3 Standard ist. Wenn dies nicht möglich ist, wären meine bevorzugten Alternativen:

  • Power Shell
  • Ein SysInternals-Dienstprogramm
  • Ein Nirsoft-Dienstprogramm
  • Ein anderes Tool von einem ähnlich angesehenen und anerkannten Entwickler.

Windows XP-Screenshot:
Windows XP - Registerkarte "Version" in den Dateieigenschaften

Windows 7-Screenshot:
Windows 7 - Registerkarte Details in den Dateieigenschaften

Iszi
quelle
1
Sie können FILEVERvon der Windows-CD installieren .
William Jackson
1
@ WilliamJackson - Das klingt nach einer möglichen Antwort. Stört es Sie, es als eine zu veröffentlichen und es vielleicht ein wenig mit einigen Informationen auszustatten, die in diesem KB-Artikel enthalten sind? Könnten Sie auch etwas für höhere Windows-Versionen vorschlagen? Ich verstehe von einigen Suchvorgängen, FILEVERdie nicht auf diesen CDs enthalten sind und daher möglicherweise kein unterstütztes Tool für diese Versionen sind.
Iszi

Antworten:

20

Sie können WMIC.exe verwenden , um den größten Teil des Weges dorthin zu schaffen:

C: \> WMIC-Datendatei, wobei Name = "C: \\ Windows \\ System32 \\ cmd.exe" Hersteller, Name, Version abruft
Herstellername Version
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Beachten Sie, dass die umgekehrten Schrägstriche \im Pfad ausgeblendet werden (sonst funktioniert es nicht).

bobbymcr
quelle
Erweiterung dieser Methode vergleichen Versionen in einer Charge: superuser.com/a/904535/131936
LogicDaemon
Sie können Sie für die meisten Operationen durch WMI müssen fast jedes O Informationen erhalten , aber es kommt mit einem großen Vorbehalt; es ist ziemlich langsam. Größenordnungen langsamer als die meisten direkteren Routen. Das heißt, es funktioniert für viele Abfragen und Überwachung.
KayleeFrye_onDeck
Dies gibt einen Fehler: wmic : Unexpected switch at this level.auf W81, gleiches gilt für Iszi Soulution.
not2qubit
2

Das Gesuchte kann mit einer Kombination aus dsofile.dll (nicht erforderlich, wenn Office installiert ist) und autoit oder einer beliebigen .NET-Sprache abgerufen werden.

Ich habe auch eine Powershell- Methode gefunden, konnte sie aber nicht testen.

Ich habe ein kleines Skript mit autoit geschrieben, das noch etwas verbessert werden muss. Ich arbeite unter Vista und kann die wenigen Aufrufe von dsofile.dll nicht so ausführen, wie ich es erwartet hätte, obwohl sie immer noch eine Ausgabe liefern, die Sie möglicherweise interessiert. Ich werde am nächsten Morgen mehr daran arbeiten, wenn ich Zugriff habe auf eine XP und Win7 VM. Beachten Sie, dass Sie den Pfad in den DLL-Funktionen an der Stelle ändern müssen, an der Sie dsofile.dll installieren.

#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
quelle
0

Nur um die Antwort von @bobbymcr weiter oben zu erläutern (die ich sehr hilfreich fand, danke!); Mit den Optionen LIST BRIEFoder LIST FULLkönnen Sie den Befehl vereinfachen und die Ergebnisse erweitern .

Überprüfen Sie > wmic datafile list /?für weitere Details.

Diese Lösung hat mir geholfen:
> wmic datafile "c:\\path\\to\\file.exe" list full

Hinweis: Wie von @bobbymcr erwähnt, denken Sie daran, die zu entkommen \, sonst funktioniert es nicht.

S3DEV
quelle
Dies funktioniert nicht ...
not2qubit
Entschuldigung, das funktioniert nicht für dich. Ich habe es gerade noch einmal versucht und es funktioniert. Win7, Administratorrechte. Vollständiger Dateipfad und Escapezeichen "\".
S3DEV