Page 1 of 1

Check wmic is available

Posted: 03 Jun 2011 13:02
by Cleptography
What is a good way to check if wmic is available on a machine
Does this work...

Code: Select all

wmic /?
if errorlevel 1 echo.Not available

Re: Check wmic is available

Posted: 03 Jun 2011 21:38
by orange_batch
WMIC is found in a static directory.

Code: Select all

if exist "%systemroot%\system32\wbem\wmic.exe" (echo:WMIC is installed.) else echo:WMIC is not installed.


AFAIK, WMIC should be installed in every Windows OS since XP (except for XP Home).

Re: Check wmic is available

Posted: 03 Jun 2011 22:28
by dbenham
orange_batch wrote:WMIC is found in a static directory.

As long as the file is in your PATH, you don't even need to know the directory to look for it efficiently. You just need to know the file name:

Code: Select all

C:\>for %a in (wmic.exe) do @echo %~$path:a
C:\Windows\System32\wbem\WMIC.exe
If not found in the PATH, the modified for variable will expand to the empty string.

So a test in batch could be:

Code: Select all

for %%a in (wmic.exe) do set wmicPath=%%~$path:a
if defined wmicPath (echo WMIC is installed) else echo WMIC is not installed


Dave Benham

Re: Check wmic is available

Posted: 03 Jun 2011 23:13
by Cleptography
@Dave & Orange
Thank you.

Re: Check wmic is available

Posted: 04 Jun 2011 01:57
by Ed Dyreen
@Cleptography
What is a good way to check if wmic is available on a machine

It's not because WMIC is present that it is also working &installed correctly!

for example a batch command for WMIC will fail in this situation

Code: Select all

Please wait while WMIC compiles updated MOF files.

Next, some code I use trying to figure out if it'll work;

Code: Select all

:ERR.Get.WMIC ( /Alias: "STRING" /ToWorkFile /Int_ERR )
::
:: SJAB v1.142c beta
::
:: Checks wheter WMIC can process @Alias
::
::INPUT:
:: @Alias             STRING    Required;       Alias to check
:: @ToWorkFile             STRING    Optional;       Save querry results to WorkFile
:: @Int_ERR             STRING    Optional;       Halt on error
::
::OUTPUT
:: @WorkFile_Succes          BYVAL    Return if @ToWorkFile;    Handle to WorkFile
:: @FullPathFile.WorkFile_Succes    BYVAL    Return if @ToWorkFile;    @FullPathFile to WorkFile
:: @ERR             BYVAL    Return;       0 for succes, 1 for error
::
SetLocal
::(
   ::set "Debug.Sub=!Sub.%Sub.Depth%.Name!"
   ::(
      ::%Debug% "" "inside !Sub.%Sub.Depth%.Name! Sub.!Sub.Depth!.Par.AsIS:" &echo.!Sub.%Sub.Depth%.Par.AsIS!_
      set "Sub.!Sub.Depth!.Use=:ERR.Get.WMIC ( /Alias: "STRING" /Int_ERR )"
   ::)

   ::%Debug% "PROC PAR"
   ::(
      set "PAR.FIX=Alias"
      set "PAR.OPT=ToWorkFile Int_ERR"
      %PROC.PAR.FAST% "()"

      ::%Debug.Equals% for %%! in ( Alias ToWorkFile Int_ERR ) do echo. %%~!=!%%~!!_
   ::)

   ::%Debug% "VALID"
   ::(
      for %%! in ( Alias ) do                %ERR.Chk.IsDefined.TokenSTR% %()% >nul

      for %%! in (

         "WorkFile_Succes"
         "WorkFile_Error"
         "WorkFile_Int_WMIC"
      ) do (
         %OpenWorkFile% "()"
         ::
         set "%%~!=!WorkFile!"
      )

      ::%Debug.Equals% for %%! in ( WorkFile_Succes WorkFile_Error WorkFile_Int_WMIC ) do echo. %%~!=!%%~!!_
   ::)

   ::%Debug% "Perform"
   ::(
      ::%Debug% " WinWaitClose: 'INT_WMIC'"
      ::(
         %WinWaitClose% /Title: "INT_WMIC" /File: "CMD.EXE"
      ::)

      ::%Debug% " Intercept 'WMIC.EXE' error: 'lockup'"
      ::(
         for %%! in (

            "!FullPath.WorkFile!\WorkFile.!WorkFile_Int_WMIC!.CMD"

         ) do    > "%%~!" (
            ::
            echo.@echo off ^&SetLocal EnableExtensions EnableDelayedExpansion
            echo.
            echo.:INIT ^(^)
            echo.::^(
            echo.   :: 120 secs * 18 = 2160 ticks
            echo.   "!FullPathFile.STACKEY.COM!" {WAIT=2160}
            echo.::^)
            echo.
            echo.:MAIN ^(^)
            echo.::^(
            echo.   taskKill.EXE /t /f /im "WMIC.EXE"
            echo.   ::
            echo.   2^>nul tasklist /nh ^|^>nul findstr.EXE /i /c:"WMIC.EXE" ^&^&goto :MAIN "^(^)"
            echo.::^)
            echo.
            echo.:EXIT ^(^)
            echo.::^(
            echo.::
            echo.goto :eof ^(^)
            echo.::^)
         )
         ::
         start "INT_WMIC" /low /min /D "!SystemROOT!" "%comspec%" /c "!FullPath.WorkFile!\WorkFile.!WorkFile_Int_WMIC!.CMD"
      ::)

      ::%Debug% " Querry 'WMIC.EXE' service: '!Alias!'"
      ::%Debug.Equals% WMIC.EXE !Alias!
      ::%Debug.Equals% pause
      ::(
         set /a ERR.MEM = 1
         ::
         for %%? in (

            "!FullPath.WorkFile!\WorkFile.!WorkFile_Error!.TMP"

         ) do    for %%! in (

            "!FullPath.WorkFile!\WorkFile.!WorkFile_Succes!.TMP"

         ) do (
            2> "%%~?" 1> "%%~!" WMIC.EXE !Alias!
            ::
            for /f "tokens=*" %%! in (

               'type "%%~!"'

            ) do    set /a ERR.MEM = 0
            ::
            for /f "tokens=*" %%! in (

               'type "%%~?"'

            ) do    set /a ERR.MEM = 1
            ::
            if !ERR.MEM! equ 0 (
               ::
               set "?="
               ::
               set /p ?=< "!FullPath.WorkFile!\WorkFile.!WorkFile_Succes!.TMP"
               ::
               set "MEM=!?!"
               ::
               set "?=!?:Please wait while WMIC compiles updated MOF files.=!"
               ::
               if /i ["!?!"] neq ["!MEM!"] (
                  ::
                  1> "%%~!" WMIC.EXE !Alias!
               )
            )
         )

         ::%Debug.Equals% echo. WorkFile_Error &type "!FullPath.WorkFile!\WorkFile.!WorkFile_Error!.TMP"
         ::%Debug.Equals% echo. WorkFile_Succes &type "!FullPath.WorkFile!\WorkFile.!WorkFile_Succes!.TMP"
         ::%Debug% " ERR.MEM=!ERR.MEM!_"
      ::)

      for %%! in (

         "WorkFile_Error"
         "WorkFile_Int_WMIC"

      ) do (
         set "WorkFile=!%%~!!"
         ::
         %CloseWorkFile% %()% >nul
      )

      for %%! in (

         "WorkFile_Succes"

      ) do (
         set "WorkFile=!%%~!!"
         ::
         if not defined ToWorkFile (

            ::%Debug% " Closing WorkFile_Succes"
            %CloseWorkFile% %()% >nul
         )
      )

      ::%Debug% " Terminate intercept: 'lockup'"
      ::(
         %WinWaitOpen%          /Title: "INT_WMIC" /File: "CMD.EXE" /Timeout: "30"
         ::
         if !ERR! equ 0 %ProcessClose%    /Title: "INT_WMIC" /File: "CMD.EXE"
      ::)

      set /a ERR = !ERR.MEM!
      ::
      if !ERR! neq 0 if defined Int_ERR (
         ::
         %ERR.Set.THIS% "'WMIC.EXE' service error:" "Alias:!Alias!_ ^!"
      )
   ::)
::
::%Debug% /Pause " WorkFile_Succes=!WorkFile!_" " ERR=!ERR!_" "outside !Sub.%Sub.Depth%.Name!"
(
   EndLocal

   set "WorkFile_Succes=%WorkFile_Succes%"
   set "FullPathFile.WorkFile_Succes=!FullPath.WorkFile!\WorkFile.!WorkFile_Succes!.TMP"

   set /a ERR = %ERR%
)
goto :eof ()
::)