3

我正在尝试从它自己的命令提示符中获取 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);
4

5 回答 5

3

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

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

获取PID.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%"
于 2013-04-24T06:34:25.427 回答
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已经退出。

于 2013-04-27T04:58:12.523 回答
0

您可能缺少一些重定向运算符。在这里阅读更多

于 2013-04-24T05:51:14.850 回答
0

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

title test
taskkill /FI "IMAGENAME eq cmd.exe" /FI "WINDOWTITLE ne test*" /f
于 2013-10-23T08:34:31.627 回答
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%
于 2013-12-20T02:09:42.357 回答