我正在尝试通过检查 .dll 文件版本来使用脚本远程监控我们服务器上的软件安装。我不确定这是否可以完成,但是在所有服务器上安装之后,我想运行一个 bat 文件来查看所有服务器并创建一个带有服务器名称和该 .dll 文件版本号的日志文件。建议会很棒。谢谢。
问问题
157 次
1 回答
1
首先从这里下载 STRINGS.EXE(处理 unicode)。 http://technet.microsoft.com/en-us/sysinternals/bb897439.aspx
这是我已经使用了很长时间的一些东西。它比您要求的要多一点,但也许其他人更愿意拥有所有这些。您可以轻松删除不需要的部分。根据需要添加/删除文件类型并删除不需要的输出部分。它并没有完全按照您的要求进行,但困难的部分已经完成,您可以根据需要进行调整。将代码另存为 FileVersions.bat(或其他)。将此 bat 文件和下载的 STRINGS.EXE 放在同一个文件夹中。执行此 bat 文件以在 FileVersions.txt(或您命名的任何 bat 文件)中获取输出。它看起来像这样。获取当前文件夹下文件夹中所有指定文件类型的版本。根据需要进行修改,然后根据需要处理多台机器。
====== 输出 ============ *.dll *.ocx *.exe 文件的版本 - Thu 08/08/2013 21:13:28.17
File=C:\Drivers\storage\strings.exe
FileDesc=strings
FileVer=2.41
ProductName=Sysinternals Strings
ProductVer=2.41
File=C:\Drivers\storage\R159108\TEACico2.dll
FileDesc=TEACico2.DLL
FileVer=1, 1, 0, 0
ProductName= TEACico2 DLL
ProductVer=1, 1, 0, 0
====== 输出结束 ============
@ECHO OFF
TITLE %~n0
PUSHD %~dp0
SET FileTypes=*.dll *.ocx *.exe
SET OutFile=%~n0.txt
IF EXIST %OutFile% DEL /q %OutFile%
ECHO.Retrieving file versions for %FileTypes% files
ECHO.
ECHO.Versions for %FileTypes% files - %Date% %Time% > %OutFile%
ECHO.
FOR /R "%CD%" %%A IN (%FileTypes%) DO ECHO.%%A & CALL :FileVersion "%%A" >> %OutFile%
ECHO.
ECHO.Results are in %OutFile%
pause
GOTO :eof
REM ========================= Subroutines =========================
:FileVersion
SETLOCAL
ECHO.
ECHO.File=%~1
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "FileDescription"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :FileVer
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET FileDesc=%%B
IF NOT "%FileDesc%"=="FileVersion" SET FileDesc
:FileVer
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "FileVersion"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :ProductName
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET FileVer=%%B
SET FileVer
:ProductName
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "ProductName"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :ProductVer
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET ProductName=%%B
IF NOT "%ProductName%"=="ProductVersion" SET ProductName
:ProductVer
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "ProductVersion"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :Done
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET ProductVer=%%B
SET ProductVer
:Done
ENDLOCAL
GOTO:EOF
于 2013-08-08T20:56:10.837 回答