C'è un modo per ottenere i metadati dei file dalla riga di comando?


19

C'è un modo per ottenere i metadati di un file dalla riga di comando in Windows XP e versioni successive?

In particolare, sono interessato a ottenere le informazioni che normalmente si possono vedere nella scheda "Dettagli" della finestra di dialogo "Proprietà" di un file in Windows 7. (Scheda "Versione" in XP.) Le schermate di entrambi sono sotto, per dare un'idea di quello che sto cercando.

Se possibile, preferirei farlo attraverso cmd.exeo qualcos'altro che viene fornito di serie con Windows XP SP3 e versioni successive. Se ciò non fosse possibile, le mie alternative preferite sarebbero:

  • PowerShell
  • Un'utilità SysInternals
  • Un'utilità Nirsoft
  • Qualche altro strumento di uno sviluppatore altrettanto affidabile e riconosciuto.

Schermata di Windows XP:
Windows XP: scheda Versione in Proprietà file

Schermata di Windows 7:
Windows 7: scheda Dettagli in Proprietà file


1
È possibile installare FILEVERdal CD di Windows.
William Jackson,

1
@WilliamJackson - Sembra una possibile risposta. Ti dispiace pubblicarlo come uno, e forse farlo diventare un po 'fuori con alcune delle informazioni contenute in quell'articolo KB? Inoltre, potresti suggerire qualcosa per le versioni successive di Windows? Capisco da alcune ricerche che FILEVERnon sono incluse in quei CD e quindi potrebbero non essere uno strumento supportato per quelle versioni.
Iszi,

Risposte:


20

È possibile utilizzare WMIC.exe per ottenere la maggior parte del modo lì:

C: \> wmic datafile dove Name = "C: \\ Windows \\ System32 \\ cmd.exe" ottiene Produttore, Nome, Versione
Nome del produttore Versione
Microsoft Corporation c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Nota la fuga delle barre rovesciate \nel percorso (in caso contrario non funziona).


estensione di questo metodo per confrontare le versioni in un batch: superuser.com/a/904535/131936
LogicDaemon

È possibile ottenere quasi tutte le informazioni sul sistema operativo necessarie per la maggior parte delle operazioni tramite WMI, ma viene fornito con un avvertimento importante ; è abbastanza lento. Gli ordini di grandezza sono più lenti della maggior parte delle rotte più dirette. Detto questo, funziona per molte domande e monitoraggio.
kayleeFrye_onDeck,

Questo dà un errore: wmic : Unexpected switch at this level.su W81, lo stesso per l'ispirazione di Iszi.
not2qubit

2

Quello che stai cercando può essere estratto con una combinazione di dsofile.dll (non necessario se hai Office installato) e autoit o qualsiasi linguaggio .NET.

Ho anche trovato un metodo PowerShell , ma non sono stato in grado di testarlo.

Ho scritto una piccola sceneggiatura con autoit che ha ancora bisogno di qualche modifica. Sono su Vista e non riesco a far funzionare le poche chiamate dsofile.dll come mi aspetterei, sebbene fornisca comunque alcuni output che potrebbero interessarti. Ci lavorerò di più al mattino quando avrò accesso su una macchina virtuale XP e win7. Si noti che è necessario modificare il percorso nelle funzioni di dll ovunque si installi 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

0

Solo per espandere la risposta di @bobbymcr sopra (che ho trovato molto utile, grazie!); puoi semplificare il comando e ampliare i risultati usando le opzioni LIST BRIEFo LIST FULL.

Controlla > wmic datafile list /?per maggiori dettagli.

Questa soluzione mi ha aiutato:
> wmic datafile "c:\\path\\to\\file.exe" list full

Nota: come menzionato da @bobbymcr, ricordati di sfuggire a \, altrimenti non funzionerà.


Questo non funziona ...
not2qubit

Mi dispiace che non funzioni per te. L'ho appena provato di nuovo e funziona. Win7, diritti di amministratore. Percorso del file completo e escape "\".
S3DEV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.