以编程方式重命名ClickOnce应用程序的当前过程

时间:2018-11-02 08:01:20

标签: vb.net

我有一个名为“ Ulti”的ClickOnce应用程序,由于我的项目要求,我需要一次运行此应用程序中的三个。在申请过程中,可能会由于满足某些要求而关闭一份或多份申请。

我有一个.bat文件,计划每10分钟运行一次;如果应用程序的所有三个副本均未运行,则应打开该应用程序的另一个实例。但是,由于该应用程序的所有三个进程都被命名为“ Ulti”,因此我的.bat文件无法区分是否正在运行该文件的3个副本,如果没有,则关闭它。

这样,是否可以在运行时通过代码动态重命名ClickOnce应用程序的进程?

1 个答案:

答案 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%
)