有没有办法从 Windows XP 及更高版本的命令行获取文件的元数据?
特别是,我感兴趣的是获取通常在 Windows 7 中文件“属性”对话框的“详细信息”选项卡上看到的信息。(XP 中的“版本”选项卡。)下面是两者的屏幕截图,以让大家了解我想要什么。
如果可能的话,我宁愿通过cmd.exe
Windows XP SP3 及更高版本自带的其他程序来实现这一点。如果这不可能,我首选的替代方案是:
- 电源外壳
- SysInternals 实用程序
- Nirsoft 实用程序
- 来自类似知名且受认可的开发商的一些其他工具。
Windows XP 屏幕截图:
Windows 7 屏幕截图:
答案1
您可以使用远程桌面连接管理器获得大部分的途径:
C:\>wmic 数据文件,其中 Name="C:\\Windows\\System32\\cmd.exe" 获取制造商、名称、版本 制造商名称 版本 微软公司 c:\windows\system32\cmd.exe 6.1.7601.17514
注意路径中反斜杠的转义\
(否则不起作用)。
答案2
您要查找的内容可以通过以下方式组合来获取dso文件(如果安装了 Office 则不需要)和自动或任何.NET 语言。
我还发现了电源外壳方法,但我还无法测试它。
我编写了一个带有 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
答案3
LIST BRIEF
只是为了扩展上面的@bobbymcr 的答案(我发现它非常有帮助,谢谢!);您可以使用或选项简化命令并扩大结果LIST FULL
。
查看> wmic datafile list /?
更多详细信息。
这个解决方案帮助了我:
> wmic datafile "c:\\path\\to\\file.exe" list full
笔记:正如@bobbymcr 提到的,记得逃避\
,否则它将不起作用。
答案4
获取所有元数据:
wmic datafile where name="c:\\path\\to\\file.ext"
若要在单独的行中整齐地查看:
wmic datafile where name="c:\\path\\to\\file.ext" get /value