CMD, , WMIC.
WMIC ' " . \". \', , .
CMD ", " . &, |, < .., , ^& ..
WMIC CMD . , CMD , WMIC - .
, PROCESS CALL CREATE PROCESS CREATE. , PROCESS CREATE, , .
, , WMIC. , , :
C:\PROGRA~1\VideoLAN\VLC_117\vlc.exe rtsp://abcd --sout="#duplicate{dst=display, dst={std{access=file, mux=ps, dst='vlc_117/video.mpg'}}} --rtsp-caching=120 --no-video-title-show"
, , WMIC :
wmic process call create 'C:\PROGRA~1\VideoLAN\VLC_117\vlc.exe rtsp://abcd --sout="#duplicate{dst=display, dst={std{access=file, mux=ps, dst='vlc_117/video.mpg'}}} --rtsp-caching=120 --no-video-title-show"'
WMIC . 'vlc_117/video.mpg' , . , .
, exe:
wmic process call create '"C:\Program Files\VideoLAN\VLC_117\vlc.exe" rtsp://abcd --sout="#duplicate{dst=display, dst={std{access=file, mux=ps, dst='vlc_117/video.mpg'}}} --rtsp-caching=120 --no-video-title-show"'
, PID , FOR/F. . CMD, =, , .., - , FOR/F. - .
for /f "tokens=2 delims=;= " %%N in (
'wmic process call create '"C:\Program Files\VideoLAN\VLC_117\vlc.exe" rtsp://abcd --sout^="#duplicate{dst=display, dst={std{access=file, mux=ps, dst='vlc_117/video.mpg'}}} --rtsp-caching=120 --no-video-title-show"' ^| find "ProcessId"'
) do set "pid=%%N"
FOR/F IN() , , WMIC - . = --sout=... .
- , , , , . , .
-, - . , , , , .
2014-05-27
. PROCESS CALL CREATE , . , . , PROCESS CALL CREATE ( , ) : (
, . \. , . googled .
, , VLC, VLC - script. , , - ?
, , . VLC, CMD/C ECHO. ECHO .
@echo off
:: All of these commands without commas work just fine
wmic process call create 'cmd /c echo hello world^&pause'
wmic process call create 'cmd /c "echo hello world&pause"'
wmic process call create "cmd /c echo hello world&pause"
:: But none of these commands with commas work
wmic process call create 'cmd /c echo hello,goodbye^&pause'
wmic process call create 'cmd /c "echo hello,goodbye&pause"'
wmic process call create "cmd /c echo hello,goodbye&pause"
wmic process call create 'cmd /c echo hello\,goodbye^&pause'
wmic process call create 'cmd /c "echo hello\,goodbye&pause"'
wmic process call create "cmd /c echo hello\,goodbye&pause"
2014-12-23: !
DosTips script PID. , WMIC . PID . . , WMIC PROCESS CALL CREATE ( ).
@echo off
setlocal enableDelayedExpansion
:: Get the PID and UID for this batch process
call :getMyPID
:: Initialize an existing PIDs list
set "PIDs= "
:: Get a list of all existing child processes, except for the
:: child CMD.EXE process that was created by this FOR /F loop.
:: This is necessary because the console session that this script
:: is running in might have previously created a child process.
for /f %%A in (
'2^>nul wmic process where "ParentProcessID=%myPID% and not CommandLine like '%%<%UID%>%%'" get ProcessID'
) do for %%B in (%%A) do set "PIDs=!PIDs!%%B "
:: Create your new process as you normally would.
:: For this demonstration, I will simply create a new CMD.EXE session
start
:: Get the PID of the newly created child process by getting all child PIDs,
:: except for the child CMD.EXE process that was created by this FOR /F loop.
:: Ignore any PID that already exists in the %PIDs% list. The only PID left
:: is your new process.
for /f %%A in (
'2^>nul wmic process where "ParentProcessID=%myPID% and not CommandLine like '%%<%UID%>%%'" get ProcessID'
) do for %%B in (%%A) do if "!PIDs: %%B =!" equ "!PIDs!" set "PID=%%B"
:: At this point you could append the new PID to the PIDs list using
:: set "PIDs=!PIDs!%PID% "
:: Then you can repeat the steps of creating a new proces and getting the new PID
::
:: But instead, I will simply show the result and exit
echo new PID=%PID%
exit /b
:getMyPID
setlocal disableDelayedExpansion
:getLock
:: Establish a nearly unique temp file name using %time%
set "lock=%temp%\%~nx0.%time::=.%.lock"
:: Transform the full path into a UID that can be used in a WMIC query
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
:: Establish an exclusive lock on the temp file
:: If this fails, then loop back and try again until success
:: This guaranees no two process will ever have the same UID
2>nul ( 9>"%lock%" (
%= The FOR /F loops creates a child CMD.EXE process which in turn invokes WMIC. =%
%= The child CMD.EXE process contains the WMIC query with the UID in its command line. =%
%= The WMIC query identifies the CMD.EXE process with the UID in the command line, =%
%= and returns the parent process ID, which happens to be the PID for this batch script =%
for /f "skip=1" %%A in (
'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
) do for %%B in (%%A) do set "PID=%%B"
(call ) %= Guarantee success so we don't accidently loop again =%
))||goto :getLock
:: Delete the temp file
del "%lock%" 2>nul
:: Return the result
( endlocal
set "myPID=%PID%"
set "UID=%uid%"
)
exit /b