コマンドラインからファイルのメタデータを取得する方法はありますか?


19

Windows XP以降のコマンドラインからファイルのメタデータを取得する方法はありますか?

特に、Windows 7のファイルの[プロパティ]ダイアログの[詳細]タブに通常表示される情報を取得することに興味があります(XPの[バージョン]タブ)。私が望んでいるものの。

可能であれば、cmd.exeWindows XP SP3以降に標準で付属しているものを使用するか、別の方法を使用します。これが不可能な場合、私が好む選択肢は次のとおりです。

  • パワーシェル
  • SysInternalsユーティリティ
  • Nirsoftユーティリティ
  • 同様に評判が良く、よく知られている開発者による他のツール。

Windows XPスクリーンショット:
Windows XP-ファイルのプロパティの[バージョン]タブ

Windows 7スクリーンショット:
Windows 7-[ファイルのプロパティ]の[詳細]タブ


1
FILEVERWindows CDからインストールできます。
ウィリアムジャクソン

1
@WilliamJackson-それは可能な答えのように聞こえます。それを1つとして投稿し、そのKB記事にある情報のいくつかでそれを少し具体化することを心がけますか?また、Windowsの上位バージョンに何かを提案できますか?私FILEVERはそれらのCDに含まれていないいくつかの検索から理解しているので、それらのバージョンでサポートされているツールではないかもしれません。
イジー

回答:


20

WMIC.exeを使用して、ほとんどの方法を取得できます。

C:\> wmic datafile where Name = "C:\\ Windows \\ System32 \\ cmd.exe" get Manufacturer、Name、Version
メーカー名バージョン
Microsoft Corporation c:\ windows \ system32 \ cmd.exe 6.1.7601.17514

\パス内のバックスラッシュのエスケープに注意してください(それ以外の場合は機能しません)。


バッチ内のバージョンを比較するためのこのメソッドの拡張:superuser.com/a/904535/131936
LogicDaemon

WMIを介してほとんどの操作に必要なOS情報を取得できますが、大きな警告があります。かなり遅いです。より直接的なルートのほとんどよりも桁違いに遅い。とはいえ、多くのクエリと監視に対して機能します。
kayleeFrye_onDeck

これによりエラーが発生しますwmic : Unexpected switch at this level.。W81では、Isziのソリューションと同じです。
-not2qubit

2

探しているものは、dsofile.dll(Officeがインストールされている場合は不要)とautoitまたは任意の.NET言語の組み合わせで取得できます。

powershellメソッドも見つけましたが、テストできませんでした。

autoitを使用して、まだ調整が必要な小さなスクリプトを作成しました。私はVista上にいて、期待どおりに機能するいくつかのdsofile.dll呼び出しを取得することはできませんが、あなたが興味を持っているかもしれないいくつかの出力を提供します。 XPおよびwin7 VMに。dll関数のパスを、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

上記の@bobbymcrの答えを拡張するだけです(非常に役に立ちました、ありがとうございます!)。LIST BRIEFまたはLIST FULLオプションを使用して、コマンドを簡素化し、結果を広げることができます。

詳細> wmic datafile list /?を確認してください。

このソリューションは私を助けました:
> wmic datafile "c:\\path\\to\\file.exe" list full

注: @bobbymcrで述べたように、をエスケープすることを忘れ\ないでください。エスケープしないと機能しません。


これは機能しません
...-not2qubit

申し訳ありませんが、これはあなたのために機能していません。私はちょうどそれをもう一度試してみましたが、動作します。Win7、管理者権限。完全なファイルパス、およびエスケープされた「\」。
S3DEV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.