在Windows命令提示符中获取自身进程的PID

3
我正在尝试从命令提示符中获取其自身的PID。但是,当使用以下命令时,我并不总是得到期望的输出。您能否指出以下语句中的错误? ```cmd tasklist /fi "imagename eq cmd.exe" /fo list /v | findstr /i "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);

为什么需要使用dir和help命令来获取PID? - Pradeep Pati
@galuano1:我正在执行针对我的项目特定的不同命令。但是例如,我已经发布了dir和help命令。 - user2282410
问题在于打错了字。你将标题设置为“mycmd”,但是搜索的是“my cmd”(实际上会搜索“my”或“cmd”)。 - Harry Johnston
如果我更改为“mycmd”,它也无效。 - user2282410
请注意,在Windows中,您不需要将命令构建为数组的一部分,尽管如果方便的话,您可以这样做。 - Harry Johnston
5个回答

4

您可以使用以下批处理文件获取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

你需要在子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实例已经退出。


0

你可能缺少一些重定向操作符。在这里阅读更多信息。


请问我缺少哪种重定向运算符? - user2282410
请阅读此处:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true - Pradeep Pati

0
给CMD窗口一个独特的名称,在这个例子中是“test”。 “Windowstitle”是“test*”,因为执行的命令行将附加到标题上。
title test
taskkill /FI "IMAGENAME eq cmd.exe" /FI "WINDOWTITLE ne test*" /f

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%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接