Windows 用于获取文件夹上的文件名和版本的批处理文件

Windows Batch File for getting file name and version on a folder

专家,

要求是获取目录路径下所有的Filename和FileVersion

示例:

Directory_Path = C:\Program Files (x86)\Oracle\Document Capture

当我 运行 批处理时,它应该理想地列出文件的所有文件名和相关文件版本(不应考虑没有版本的任何文件或不应考虑任何文件夹)

我的预期输出:

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?

但是我想不出一个方法来自动将每个文件名传递到这个命令中并让我在文本文件中输出。

感谢任何帮助

最简单的解决方案是在WHERE 子句中指定驱动器和路径,让WMIC 发现文件名。您还可以在 where 子句中指定 VERSION IS NOT NULL。

列出的文件名将只是基本文件名,没有扩展名。该扩展程序在“扩展程序”列中可用(太棒了!)。

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 循环迭代所有文件,然后在由 FOR /F 解析的单独 WMIC 调用中传递每个文件的完整路径。关于 FOR /F 如何将 WMIC unicode 输出转换为 ansi,有一个不幸的 "feature"(又名错误),这样所有行都有一个不需要的尾部回车 return (\r),这可能会导致各种问题。额外的 FOR /F 语句消除了不需要的尾随 \r。

不需要 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