在 cmd.exe 中,你可以使用以下命令按 PID 和窗口标题列出当前正在运行的窗口:
tasklist /fi "imagename eq cmd.exe" /fo list /v
但是,如果 cmd 在 Windows 终端应用程序中运行,则此方法不起作用。它列出 PID,但不列出标题,标题显示为“N/A”。由于 Windows 11 强制您始终使用终端,这会破坏许多使用任务列表进行自我识别或识别其他应用程序的批处理应用程序。
有没有办法获取当前打开的 Windows 终端选项卡及其标题的列表?或者,有没有办法在 Windows 11 上的 Windows 终端之外启动 cmd.exe 而不更改默认值?
我尝试过tasklist /fi "imagename eq WindowsTerminal.exe" /fo list /v
但它只列出一个窗口而没有选项卡的标题。
答案1
新的发布方式
此方法可启动任何程序并获取 PID,理想情况下应该是未来的标准:
powershell -executionPolicy bypass -command "& {$process = start-process $args[0] -passthru -argumentlist $args[1..($args.length-1)]; exit $process.id}" FileToRun.bat Parameters
echo Process ID of new process: %errorlevel%
在批处理文件中自行识别 PID
虽然这不能让您识别其他批处理文件的 PID,但此方法允许批处理文件自我识别其 PID:
FOR /F "tokens=*" %%G in ('powershell -ExecutionPolicy Unrestricted -Command "(New-Guid).guid"') do Set my_guid=%%~G
powershell -ExecutionPolicy Unrestricted -Command "(Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId>"%temp%\%my_guid%.pid"
FOR /F "tokens=*" %%P in ('type "%temp%\%my_guid%.pid"') do set my_pid=%%~P
del /f /q "%temp%\%my_guid%.pid"
(请注意,必须使用临时文件,因为当命令在 for 循环中运行时,for 循环将成为父进程)。
在传统 Conhost.exe 中启动批处理文件
您还可以在传统窗口中启动cmd.exe窗口,这将向后兼容其他方法。
cmd.exe 并不是 Windows Terminal 最初取代的模拟器。cmd.exe 是在模拟器中运行的命令处理器。传统的模拟器是 conhost.exe。
因此,您可以直接在 conhost 中运行批处理文件或 cmd.exe:
conhost.exe Listener.bat
您可以使用 VBScript 在后台启动批处理文件,如下所示:
Set oShell = CreateObject("WScript.Shell")
oShell.Run """Listener.bat""", 0
这仍然在传统的 conhost.exe 实例中运行并与 tasklist 一起工作。
向 Microsoft 报告错误
答案2
使用 PowerShell,您可以通过以下方式获取 ID:
Get-Process -Name "cmd" | Select Id
假设您只想列出cmd
选项卡。对我来说,适用于 Windows 11 中的 Windows 终端进程。但是,Windows 标题似乎是空的,可能是因为它们是子进程,通常不能作为单独的窗口工作,因为它们是选项卡。