我有一个名为“ Ulti”的ClickOnce应用程序,由于我的项目要求,我需要一次运行此应用程序中的三个。在申请过程中,可能会由于满足某些要求而关闭一份或多份申请。
我有一个.bat文件,计划每10分钟运行一次;如果应用程序的所有三个副本均未运行,则应打开该应用程序的另一个实例。但是,由于该应用程序的所有三个进程都被命名为“ Ulti”,因此我的.bat文件无法区分是否正在运行该文件的3个副本,如果没有,则关闭它。
这样,是否可以在运行时通过代码动态重命名ClickOnce应用程序的进程?
答案 0 :(得分:0)
您不能在运行时重命名进程名称。但是,如果您的bat文件是启动程序,则可以将一些“假”参数(例如“ 1”,“ 2”等)传递给您的应用程序。它对您的应用程序没有任何影响,但是您可以通过解析命令行来区分您的进程。
要获取流程命令行参数,可以使用 WMIC /?。这是一个示例:
@echo off
SET PROCESSNAME=notepad.exe
SET PROCESSDIR=C:\Windows
SET PROCESSFULLPATH=%PROCESSDIR%\%PROCESSNAME%
SET WMIC=C:\Windows\System32\wbem\WMIC.exe
SET PID1=1
SET PID2=2
SET PID3=3
REM Prepare
taskkill /IM notepad.exe
CLS
REM 3 Fake notepads
start /b /d "%PROCESSDIR%" %PROCESSNAME% %PID1%
start /b /d "%PROCESSDIR%" %PROCESSNAME% %PID2%
start /b /d "%PROCESSDIR%" %PROCESSNAME% %PID3%
echo You have a time for manual kill some notepad
pause
REM Restart if not founded 1 or 2 or 3 process.
REM 2nd loop doesn't working
REM Process 1
SET PROCESSID=%PID1%
SET KILLED=1
FOR /F "tokens=2" %%x IN ('%WMIC% /OUTPUT:STDOUT process where Name^="%PROCESSNAME%" get Commandline ^|find "%PROCESSNAME%"') DO (
IF "%%x"=="%PROCESSID%" (
SET KILLED=0
)
)
IF %KILLED%==1 (
echo Process %PROCESSID% killed. Restarting...
REM Restart dead copy with %KILLED% index
start /b /d "%PROCESSDIR%" %PROCESSNAME% %PROCESSID%
)
REM Process 2
SET PROCESSID=%PID2%
SET KILLED=1
FOR /F "tokens=2" %%x IN ('%WMIC% /OUTPUT:STDOUT process where Name^="%PROCESSNAME%" get Commandline ^|find "%PROCESSNAME%"') DO (
IF "%%x"=="%PROCESSID%" (
SET KILLED=0
)
)
IF %KILLED%==1 (
echo Process %PROCESSID% killed. Restarting...
REM Restart dead copy with %KILLED% index
start /b /d "%PROCESSDIR%" %PROCESSNAME% %PROCESSID%
)
REM Process 3
SET PROCESSID=%PID3%
SET KILLED=1
FOR /F "tokens=2" %%x IN ('%WMIC% /OUTPUT:STDOUT process where Name^="%PROCESSNAME%" get Commandline ^|find "%PROCESSNAME%"') DO (
IF "%%x"=="%PROCESSID%" (
SET KILLED=0
)
)
IF %KILLED%==1 (
echo Process %PROCESSID% killed. Restarting...
REM Restart dead copy with %KILLED% index
start /b /d "%PROCESSDIR%" %PROCESSNAME% %PROCESSID%
)