web-dev-qa-db-ja.com

バッチファイルからインストールされたプログラムのバージョンを見つける

開発者設定の一部としていくつかのプログラムをインストールするバッチファイルがあります。これは、使用済みコンポーネントの新しいバージョンを取得するときに定期的に実行されます。したがって、バージョンが異なる場合にのみインストールするとよいでしょう。

コマンドプロンプトでこれを実行し、インストールされているバージョンを取り戻すことができます。

wmic datafile where name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe' get version /format:list

これは出力を与えますVersion=12.1.369.0

しかし、これをこのようなバッチファイルに入れて、バージョンを抽出しようとすると、次のようになります。

echo off
FOR /F "tokens=2 delims==" %%I in ('"wmic datafile where^(name^="C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe" get version /format:list"') DO (SET "RESULT=%%I")
ECHO %RESULT%

応答があります\\Common was unexpected at this time.

これを修正するためにネットから何かを試しているので、いくつかの部分は冗長かもしれません。

私は何を逃しましたか?

6
graham.reeds

誤って配置された二重引用符のセットと、追加の(があります。

WMICはSQL構文を使用し、文字列は一重引用符で囲まれています。内部の一重引用符は、一重引用符を囲むコマンドに干渉しません。

WHERE句(WHEREキーワードを含まない)を二重引用符で囲んで、FOR DO()句内のエスケープの問題を回避できます。

@echo off
FOR /F "tokens=2 delims==" %%I IN (
  'wmic datafile where "name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe'" get version /format:list'
) DO SET "RESULT=%%I"
ECHO %RESULT%

しかし、これが完全な解決策ではないかもしれません。上記のコードでは表示できませんが、RESULTには実際には末尾のキャリッジリターン(0x0D)が含まれています。これは、FOR/FがWMICユニコード出力を処理する方法の癖によるものです。 WMIC出力のすべての行には、追加の後続キャリッジリターンがあります。

常に%RESULT%(通常の展開)を使用してRESULTにアクセスする限り、問題は発生しません。ただし、拡張を遅らせる必要がある場合は、以下に示すように、問題が発生する可能性があります。

@echo off
setlocal enableDelayedExpansion
FOR /F "tokens=2 delims==" %%I IN (
  'wmic datafile where "name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe'" get version /format:list'
) DO SET "RESULT=%%I"
ECHO %RESULT%xxx
ECHO !RESULT!xxx

不要なキャリッジリターンを取り除く便利な方法の1つは、追加レベルのFORを使用することです。

@echo off
setlocal enableDelayedExpansion
FOR /F "tokens=2 delims==" %%I IN (
  'wmic datafile where "name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe'" get version /format:list'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "RESULT=%%A"
ECHO %RESULT%xxx
ECHO !RESULT!xxx
9
dbenham

これは私のfileverbatファイルです。

@echo off

If "%~1"=="" goto help
If "%~1"=="/?" goto help
If /i "%~1"=="/h" goto help
If "%~1"=="-?" goto help
If /i "%~1"=="-h" goto help

set filepath=%~f1
set  file=%filepath:\=\\%
wmic datafile where name^="%file%" get version|findstr /i /v /c:"version"
echo %errorlevel%
goto finish

:help
Echo.
Echo. FileVer
Echo. -------
Echo.
Echo. Purpose:
Echo.
Echo.    Reports the version number for an exe, dll, and similar files.
Echo.
Echo. Usage:
Echo.
Echo.    filever ^<executable file^>
Echo.
Echo.    filever [/h ^| -h ^| /? ^| -?]    Starts this help
Echo.
echo. Examples:
Echo.
Echo.    filever c:\windows\Explorer.exe
Echo.    filever "C:\Program Files\Windows NT\Accessories\wordpad.exe"
Echo.    filever Shell32.dll

Echo.
Echo.    For Help
Echo.
Echo.    filever 

Echo.    filever /?
Echo.

:finish
rem Pause if command double clicked
If /i "%cmdcmdline:~0,6%"=="cmd /c" pause

コマンド全体の周りに余分な引用符のセットがあるようです

Forループの問題の1つは、バージョンの後にwmicが空白行を出力することです。

set filepath=%~f1
set  file=%filepath:\=\\%
for /f  "tokens=1 eol= " %%A in ('wmic datafile where name^="%file%" get version^|findstr /i /v /c:"version"') do set a=%%A & echo %%A

それをファイルに入れます。ファイルには2行の空白行がありますが。

set filepath=%~f1
set  file=%filepath:\=\\%
wmic datafile where name^="%file%" get version|findstr /i /v /c:"version">test.txt

多分これはうまくいくかもしれません

set filepath=%~f1
set  file=%filepath:\=\\%
for /f  "tokens=1 eol= " %%A in ('wmic datafile where name^="%file%" get version^|findstr /i /v /c:"version"') do if not ""==%%A set a=%%A & echo %%A

または、別のバッチファイルを呼び出して、戻らないでください。

空白行を取り除く方法は次のとおりです。

set filepath=%~f1
set  file=%filepath:\=\\%
for /f  "tokens=1 eol= " %%A in ('wmic datafile where name^="%file%" get version^|findstr /i /v /c:"version"^|findstr /i /v /r "^$"') do set a=%%A & echo %A%
wmic datafile where name^="%file%" get version|findstr /i /v /c:"version"|findstr /i /v /r "^$">test.txt
0
Noodles

これは別の方法で、PowerShellGet-WmiObjectのWMICをバイパスします。

@ECHO OFF
start /b powershell.exe -command "Get-WmiObject -Class CIM_DataFile -Filter \"Name='C:\\Program Files (x86)\\Knuckle.dll'\" | Select-Object Version"
PAUSE

.cmdバッチファイルをダブルクリックすると、この結果が返されます。

Version
-------
0.0.0.0
0
Knuckle-Dragger

および外部ツールを使用しない2つの方法1 .[〜#〜] wmic [〜#〜]

WMIC DATAFILE WHERE name="C:\\install.exe" get Version /format:Textvaluelist

ファイル名の二重スラッシュに注意してください。

2 .[〜#〜] makecab [〜#〜] WMICはWindowsのホームバージョンにインストールされていないため、すべてのWindowsマシンで実行されるmakecabを使用する方法は次のとおりです。

; @echo off
;;goto :end_help
;;setlocal DsiableDelayedExpansion
;;;
;;;
;;; fileinf /l list of full file paths separated with ;
;;; fileinf /f text file with a list of files to be processed ( one on each line )
;;; fileinf /? prints the help
;;;
;;:end_help

; REM Creating a Newline variable (the two blank lines are required!)
; set NLM=^


; set NL=^^^%NLM%%NLM%^%NLM%%NLM%
; if "%~1" equ "/?" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; if "%~2" equ "" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; setlocal enableDelayedExpansion
; if "%~1" equ "/l" (
;  set "_files=%~2"
;  echo !_files:;=%NL%!>"%TEMP%\file.paths"
;  set _process_file="%TEMP%\file.paths"
;  goto :get_info
; )

; if "%~1" equ "/f" if exist "%~2" (
;  set _process_file="%~2"
;  goto :get_info
; )

; echo incorect parameters & exit /b 1
; :get_info
; set "file_info="

; makecab /d InfFileName=%TEMP%\file.inf /d "DiskDirectory1=%TEMP%" /f "%~f0"  /f %_process_file% /v0>nul

; for /f "usebackq skip=4 delims=" %%f in ("%TEMP%\file.inf") do (
;  set "file_info=%%f"
;  echo !file_info:,=%nl%!
; )

; endlocal
;endlocal
; del /q /f %TEMP%\file.inf 2>nul
; del /q /f %TEMP%\file.path 2>nul
; exit /b 0

.set DoNotCopyFiles=on
.set DestinationDir=;
.set RptFileName=nul
.set InfFooter=;
.set InfHeader=;
.Set ChecksumWidth=8
.Set InfDiskLineFormat=;
.Set Cabinet=off
.Set Compress=off
.Set GenerateInf=ON
.Set InfDiskHeader=;
.Set InfFileHeader=;
.set InfCabinetHeader=;
.Set InfFileLineFormat=",file:*file*,date:*date*,size:*size*,csum:*csum*,time:*time*,vern:*ver*,vers:*vers*,lang:*lang*"

出力例(wmicメソッドへの小さな追加である文字列バージョンがあります:)):

c:> fileinfo.bat /l C:\install.exe
    file:install.exe
    date:11/07/07
    size:562688
    csum:380ef239
    time:07:03:18a
    vern:9.0.21022.8
    vers:9.0.21022.8 built by: RTM
    lang:1033

Shell.applicationとハイブリッドbatch\jscriptを使用します。tooptipInfo。バット

@if (@X)==(@Y) @end /* JScript comment
    @echo off

    rem :: the first argument is the script name as it will be used for proper help message
    cscript //E:JScript //nologo "%~f0" %*

    exit /b %errorlevel%

@if (@X)==(@Y) @end JScript comment */

////// 
FSOObj = new ActiveXObject("Scripting.FileSystemObject");
var ARGS = WScript.Arguments;
if (ARGS.Length < 1 ) {
 WScript.Echo("No file passed");
 WScript.Quit(1);
}
var filename=ARGS.Item(0);
var objShell=new ActiveXObject("Shell.Application");
/////


//fso
ExistsItem = function (path) {
    return FSOObj.FolderExists(path)||FSOObj.FileExists(path);
}

getFullPath = function (path) {
    return FSOObj.GetAbsolutePathName(path);
}
//

//paths
getParent = function(path){
    var splitted=path.split("\\");
    var result="";
    for (var s=0;s<splitted.length-1;s++){
        if (s==0) {
            result=splitted[s];
        } else {
            result=result+"\\"+splitted[s];
        }
    }
    return result;
}


getName = function(path){
    var splitted=path.split("\\");
    return splitted[splitted.length-1];
}
//

function main(){
    if (!ExistsItem(filename)) {
        WScript.Echo(filename + " does not exist");
        WScript.Quit(2);
    }
    var fullFilename=getFullPath(filename);
    var namespace=getParent(fullFilename);
    var name=getName(fullFilename);
    var objFolder=objShell.NameSpace(namespace);
    var objItem=objFolder.ParseName(name);
    //https://msdn.Microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx
    WScript.Echo(fullFilename + " : ");
    WScript.Echo(objFolder.GetDetailsOf(objItem,-1));

}

main();

cmd.exeに対して使用されます:

C:\Windows\System32\cmd.exe :
File description: Windows Command Processor
Company: Microsoft Corporation
File version: 6.3.9600.16384
Date created: ?22-?Aug-?13 ??13:03
Size: 347 KB
0
npocmaka