Có cách nào để lấy siêu dữ liệu tệp từ dòng lệnh không?


19

Có cách nào để lấy siêu dữ liệu của tệp từ dòng lệnh trong Windows XP trở lên không?

Đặc biệt, tôi quan tâm đến việc lấy thông tin mà người ta thường thấy trên tab "Chi tiết" của hộp thoại "Thuộc tính" của tệp trong Windows 7. (tab "Phiên bản" trong XP.) Ảnh chụp màn hình của cả hai bên dưới, để đưa ra ý tưởng về những gì tôi đang theo đuổi.

Nếu có thể, tôi muốn thực hiện điều này thông qua cmd.exehoặc một cái gì đó khác đạt tiêu chuẩn với Windows XP SP3 trở lên. Nếu điều này là không thể, lựa chọn thay thế ưa thích của tôi sẽ là:

  • PowerShell
  • Một tiện ích SysIternals
  • Một tiện ích Nirsoft
  • Một số công cụ khác từ một nhà phát triển có uy tín và được công nhận tương tự.

Ảnh chụp màn hình Windows XP:
Windows XP - tab Phiên bản trong Thuộc tính tệp

Ảnh chụp màn hình Windows 7:
Windows 7 - Tab chi tiết trong Thuộc tính tệp


1
Bạn có thể cài đặt FILEVERtừ CD Windows.
William Jackson

1
@WilliamJackson - Nghe có vẻ như một câu trả lời có thể. Bạn có muốn đăng nó dưới dạng một và có thể làm sáng tỏ một chút với một số thông tin trong bài viết KB đó không? Ngoài ra, bạn có thể đề xuất một cái gì đó cho các phiên bản Windows cao hơn không? Tôi hiểu từ một số tìm kiếm FILEVERkhông có trong các đĩa CD đó và do đó có thể không phải là một công cụ được hỗ trợ cho các phiên bản đó.
Iszi

Câu trả lời:


20

Bạn có thể sử dụng WMIC.exe để có được hầu hết các cách đó:

C: \> tệp dữ liệu wmic trong đó Name = "C: \\ Windows \\ System32 \\ cmd.exe" nhận Nhà sản xuất, Tên, Phiên bản
Tên nhà sản xuất Phiên bản
Tập đoàn Microsoft c: \ windows \ system32 \ cmd.exe 6.1.7601.17514

Lưu ý thoát khỏi dấu gạch chéo ngược \trong đường dẫn (nó không hoạt động khác).


mở rộng phương pháp này để so sánh các phiên bản trong một đợt: superuser.com/a/904535/131936
LogicDaemon

Bạn có thể nhận được bất kỳ thông tin hệ điều hành nào bạn cần cho hầu hết các hoạt động thông qua WMI nhưng nó đi kèm với một cảnh báo lớn ; nó khá chậm Đơn đặt hàng có cường độ chậm hơn hầu hết các tuyến trực tiếp hơn. Điều đó nói rằng, nó không hoạt động cho rất nhiều truy vấn và giám sát.
kayleeFrye_onDeck

Điều này đưa ra một lỗi: wmic : Unexpected switch at this level.trên W81, tương tự đối với linh hồn Iszi.
not2qubit

2

Những gì bạn đang tìm kiếm có thể được kéo với sự kết hợp của dsofile.dll (không cần thiết nếu bạn có Office được cài đặt) và AutoIt hoặc bất kỳ ngôn ngữ .NET.

Tôi cũng tìm thấy một phương pháp powershell , nhưng tôi chưa thể thử nghiệm nó.

Tôi đã viết lên một đoạn script nhỏ với autoit vẫn cần một số điều chỉnh. Tôi đang dùng Vista và tôi không thể thực hiện được một số cuộc gọi DSofile.dll như tôi mong đợi, mặc dù nó vẫn cung cấp một số đầu ra mà bạn có thể quan tâm. Tôi sẽ làm việc này nhiều hơn vào buổi sáng khi tôi có quyền truy cập đến máy ảo XP và win7. Lưu ý rằng bạn cần thay đổi đường dẫn trong các hàm dll thành bất cứ nơi nào bạn cài đặt 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

Chỉ cần mở rộng câu trả lời của @bobbymcr ở trên (mà tôi thấy rất hữu ích, cảm ơn bạn!); bạn có thể đơn giản hóa lệnh và mở rộng kết quả bằng cách sử dụng LIST BRIEFhoặc LIST FULLtùy chọn.

Kiểm tra > wmic datafile list /?để biết thêm chi tiết.

Giải pháp này đã giúp tôi:
> wmic datafile "c:\\path\\to\\file.exe" list full

Lưu ý: Như được đề cập bởi @bobbymcr, hãy nhớ thoát \, nếu không nó sẽ không hoạt động.


Điều này không hoạt động ...
not2qubit

Xin lỗi điều này không làm việc cho bạn. Tôi vừa mới thử lại và nó hoạt động. Win7, quyền quản trị. Đường dẫn tệp đầy đủ và thoát '\'.
S3DEV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.