3

我有一个功能可以制作一个窗口 - 一个 TOPMOST 窗口。

所以 - 我可以运行这个:

Get-WindowByProcessTitle *chrome* | Set-TopMost

请注意,这里的参数是一个进程名称("chrome"是在"chrome.exe"哪个进程中)。

最终选择进程的内部代码是:

Get-Process |  Where-Object {$_.MainWindowTitle -like "*chrome*"} | Select-Object Id,Name,MainWindowHandle,MainWindowTitle

伟大的。

问题

现在我有一个查询,它window根据它选择一个title

Select-Window *chrome* |  Where {$_.Title  -like "*$WindowTitle*"} | Select-Object -first 1  

产生:

ProcessName : chrome
ProcessId   : 3972
IsActive    : False
Handle      : 1641684
Title       : Watch Full movie The Beach (2000) Online Free | FFilms.org - Google Chrome
Class       : Chrome_WidgetWin_1

如何从我的这个查询中获取流程对象 (而不是 ProcessId)?

我想我需要类似的东西:(伪)

Select-Window *chrome* |  Where {$_.Title  -like "*$WindowTitle*"} |What_Is_MyProcess_Object? |Select-Object Id,Name,MainWindowHandle,MainWindowTitle
4

2 回答 2

2

Walid 的回答是有效的,但它会返回带有匹配进程的对象ProcessName。你正在寻找一个匹配的单processId

如果您不需要其他数据,您只需选择 ProcessID

从您的代码段:

Select-Window *Online video* |  Where {$_.Title  -like "*$WindowTitle*"} | Select-Object -first 1  

只需将该代码放在 Get-Process 调用中即可。

Get-Process -Pid (Select-Window *Online video* |  Where {$_.Title  -like "*$WindowTitle*"} | Select-Object -first 1 ).ProcessID

这将从您的代码中扩展进程 ID 并将其放入-pidget-process cmdlet 中。一个更优雅的解决方案可能是这个

$processToLocate = Select-Window *Online video* |  Where {$_.Title  -like "*$WindowTitle*"} | Select-Object -first 1 -ExpandProperty ProcessID
Get-Process -Pid $processToLocate

这应该做同样的事情。只是可能更容易阅读。只是使用-ExpandProperty而不是(Object).Property. 在这两种情况下都实现了相同的目标。

或者

瓦利德从评论中的建议也行得通

Select-Window *Online video* |  Where {$_.Title  -like "*$WindowTitle*"} | Select-Object -first 1  | Get-Process -PID {$_.ProcessID}

总是虽然那只能用于$_像foreach这样的东西。谢谢你的提示。

于 2014-09-14T11:56:52.667 回答
1

如果工作,试试这个:

....$WindowTitle*"} | get-process |Select-Object ..
于 2014-09-14T11:43:38.587 回答