Existe-t-il un moyen d'obtenir des métadonnées de fichier à partir de la ligne de commande?

19

Existe-t-il un moyen d'obtenir les métadonnées d'un fichier à partir de la ligne de commande dans Windows XP et supérieur?

En particulier, je suis intéressé à obtenir les informations que l'on peut normalement voir sur l'onglet "Détails" de la boîte de dialogue "Propriétés" d'un fichier dans Windows 7. (onglet "Version" dans XP.) Des captures d'écran des deux sont ci-dessous, pour donner une idée de ce que je recherche.

Si possible, je préfère le faire cmd.exeou autre chose qui est livré en standard avec Windows XP SP3 et supérieur. Si ce n'est pas possible, mes alternatives préférées seraient:

  • PowerShell
  • Un utilitaire SysInternals
  • Un utilitaire Nirsoft
  • Un autre outil d'un développeur de même réputation et bien reconnu.

Capture d'écran de Windows XP:
Windows XP - Onglet Version dans les propriétés du fichier

Capture d'écran de Windows 7:
Windows 7 - onglet Détails dans les propriétés du fichier

Iszi
la source
1
Vous pouvez installer à FILEVERpartir du CD Windows.
William Jackson
1
@WilliamJackson - Cela ressemble à une réponse possible. Cela vous dérange de le publier comme un seul, et peut-être de l'étoffer un peu avec certaines des informations contenues dans cet article de la base de connaissances? Pourriez-vous également suggérer quelque chose pour les versions supérieures de Windows? Je comprends d'une recherche qui FILEVERn'est pas incluse sur ces CD, et peut donc ne pas être un outil pris en charge pour ces versions.
Iszi

Réponses:

20

Vous pouvez utiliser WMIC.exe pour obtenir la plupart du chemin:

C: \> wmic datafile where Name = "C: \\ Windows \\ System32 \\ cmd.exe" get Manufacturer, Name, Version
Nom du fabricant Version
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Notez l'échappement des barres obliques inverses \dans le chemin (cela ne fonctionne pas autrement).

bobbymcr
la source
extension de cette méthode pour comparer les versions dans un lot: superuser.com/a/904535/131936
LogicDaemon
Vous pouvez obtenir à peu près toutes les informations sur le système d'exploitation dont vous avez besoin pour la plupart des opérations via WMI, mais cela comporte une mise en garde majeure ; c'est assez lent. Des ordres de grandeur plus lents que la plupart des routes les plus directes. Cela dit, cela fonctionne pour beaucoup de requêtes et de surveillance.
kayleeFrye_onDeck
Cela donne une erreur: wmic : Unexpected switch at this level.sur W81, idem pour Iszi soulution.
not2qubit
2

Ce que vous recherchez peut être extrait avec une combinaison de dsofile.dll (non nécessaire si vous avez installé Office) et autoit ou tout autre langage .NET.

J'ai également trouvé une méthode PowerShell , mais je n'ai pas pu la tester.

J'ai écrit un petit script avec autoit qui a encore besoin de quelques ajustements. Je suis sous Vista et je ne parviens pas à faire fonctionner les quelques appels dsofile.dll comme je m'y attendais, bien qu'il fournisse toujours une sortie qui pourrait vous intéresser. Je travaillerai plus sur ce sujet le matin quand j'aurai accès à une machine virtuelle XP et win7. Notez que vous devez modifier le chemin d'accès dans les fonctions dll à l'endroit où vous installez 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
la source
0

Juste pour développer la réponse de @bobbymcr ci-dessus (que j'ai trouvée très utile, merci!); vous pouvez simplifier la commande et élargir les résultats en utilisant les options LIST BRIEFou LIST FULL.

Vérifiez > wmic datafile list /?pour plus de détails.

Cette solution m'a aidé:
> wmic datafile "c:\\path\\to\\file.exe" list full

Remarque: Comme mentionné par @bobbymcr, n'oubliez pas d'échapper à la \, sinon cela ne fonctionnera pas.

S3DEV
la source
Cela ne fonctionne pas ...
not2qubit
Désolé, cela ne fonctionne pas pour vous. Je viens de l'essayer à nouveau et cela fonctionne. Win7, droits d'administrateur. Chemin d'accès complet au fichier et échappé «\».
S3DEV