从Windows命令提示符获取自己的进程pid

时间:2013-04-24 04:47:49

标签: java windows cmd

我正试图从自己的命令提示符中获取PID。但是当使用下面的命令时,我总是得不到所需的输出。你能指出下面的陈述中的错误是什么吗?

cmd.exe /c title="mycmd" & tasklist /v /fo csv | findstr /i "mycmd" & dir & help

修改

以下命令正常工作。但是当它与另外两个命令结合时。它不起作用。

cmd.exe /c title="mycmd" & tasklist /v /fo csv | findstr /i "mycmd"

其他信息:

我正在使用Java

final List<String> commands = new ArrayList<String>();                

commands.add("cmd.exe");
commands.add("/C");

//.. Add more commands

ProcessBuilder pb = new ProcessBuilder(commands);

5 个答案:

答案 0 :(得分:3)

您可以使用以下批处理文件获取cmd提示的PID。

参考: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/270f0842-963d-4ed9-b27d-27957628004c/

<强> GetPID.bat

@echo off
if not defined SESSIONNAME set SESSIONNAME=Console
setlocal
set instance=%DATE% %TIME% %RANDOM%
title %instance%
for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq %instance%" ^| find /i "PID:"`)
    do set PID=%%a
if not defined PID for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq Administrator:  %instance%" ^| find /i "PID:"`)
    do set PID=%%a
if not defined PID
 echo !Error: Could not determine the Process ID of the current script.  Exiting.& exit /b 1
echo PID: "%PID%"

答案 1 :(得分:1)

您需要在子shell中执行复合命令的引号:

cmd.exe /c "title="mycmd" & tasklist /v /fo csv | findstr /i "mycmd" & dir & help"

如果没有引号,该命令将被解析为

(cmd.exe /c title="mycmd") & (tasklist /v /fo /csv) | (findstr /i "mycmd") & (dir) & (help)

所以当tasklist运行时,具有指定标题的cmd.exe实例已经退出。

答案 2 :(得分:0)

您可能缺少一些重定向运算符。阅读更多here.

答案 3 :(得分:0)

为CMD窗口指定一个唯一的名称,在本例中为“test”。 “Windowstitle”是“test *”,因为执行的命令行将附加到标题。

title test
taskkill /FI "IMAGENAME eq cmd.exe" /FI "WINDOWTITLE ne test*" /f

答案 4 :(得分:0)

我发现我还必须使用具有用户名的域名。

    @IF NOT DEFINED SESSIONNAME (@SET SESSIONNAME=Console)
    @SETLOCAL
    @SET EXITCODE=0
    @SET instance=%DATE% %TIME% %RANDOM%
    @TITLE %instance%

    @FOR /F "usebackq tokens=1,2" %%a IN (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "WINDOWTITLE eq %instance%" ^| FIND /I "PID:"`) DO @(
        @SET PID=%%b
    )

    @IF NOT DEFINED PID (
        @FOR /F "usebackq tokens=1,2" %%a IN (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "WINDOWTITLE eq Administrator:  %instance%" ^| FIND /I "PID:"`) DO @(
            @SET PID=%%b
        )
    )

    @IF NOT DEFINED PID (
        @ECHO ERROR: Could not determine the Process ID of the current script.
        @SET EXITCODE=1
    ) ELSE (
        @ECHO %PID%
    )

    @EXIT /B %EXITCODE%