2017-03-03 76 views
0

專家Windows批處理文件,用於獲取文件名和版本的文件夾上

要求是讓所有的文件名和文件版本的目錄路徑

例子:

目錄路徑= C :\ Program Files(x86)\ Oracle \ Document Capture

當我運行批處理時,應該理想地列出所有的fi lenames和文件的相關文件版本(不應該考慮任何文件,而無需版本或不應該考慮任何文件夾)

我的預期輸出:

Filename Fileversion 

-------- ----------- 

vabc.dll 1.3 

vabd.dll 1.3 

vace.dll 1.4 

我發現這對我們的Windows 2008 R2

wmic datafile where name="C:\\Windows\\System32\\msiexec.exe" get Version /value 
工作

來源= Windows: Command line to read version info of an executable file?

但我無法想出一個方法來自動將每個文件名傳遞到此命令並讓我輸出在文本文件中。

任何幫助表示讚賞

回答

2

最簡單的方法是指定在WHERE子句中的驅動器和路徑,讓WMIC發現文件名。您還可以在where子句中指定VERSION IS NOT NULL。

列出的FileName將只是基本文件名,沒有擴展名。該擴展程序可在擴展列中找到(看上去!)。

wmic datafile where "drive='c:' and path='\\Program Files (x86)\\Oracle\\Document Capture\\' and version is not null" get FileName, Extension, Version 

列總是按字母順序(按名稱)列出,無論您要求什麼順序。所以,你應該得到的輸出如下所示:

Extension FileName Version 
dll  vabc  1.3 
dll  vabd  1.3 
dll  vace  1.3 

或者你可以請求名稱列,而不是文件名和擴展,但將包括完整的路徑。

Name              Version 
C:\Program Files (x86)\Oracle\Document Capture\vabc.dll 1.3 
C:\Program Files (x86)\Oracle\Document Capture\vabd.dll 1.3 
C:\Program Files (x86)\Oracle\Document Capture\vace.dll 1.4 

另一種選擇是使用一個for循環迭代中的所有文件,然後通過在一個單獨的WMIC調用由FOR/F分析每個文件的完整路徑。有一個不幸的「功能」(aka bug)與FOR/F如何將WMIC unicode輸出轉換爲ansi,以致所有行都有不需要的尾隨回車符(\ r)可導致各種問題。不需要的尾部\ r被額外的FOR/F語句消除。

VERSION IS NOT NULL子句不是必需的,因爲FOR/F語句對將去除只包含空格的行。然後

@echo off 
set "loc=C:\Program Files (x86)\Oracle\Document Capture\" 
pushd "%loc%" 
for %%F in (*) do for /f "skip=1 tokens=*" %%A in (
    'wmic datafile where "name='%loc:\=\\%%%F'" get version 2^>nul' 
) do for /f "delims=" %%V in ("%%A") do echo %%F %%V 
popd 

輸出應該如下所示:

vabc.dll 1.3 
vabd.dll 1.3 
vace.dll 1.4 
+0

謝謝!!奇蹟般有效! –