使用我的代码,我要获取一个名为VNCviewer的程序的ProcessID,然后在此程序中打开一个新会话,此时,我已经获得了Overview控制台的ProcessID和一个不知道ProcessID的已打开会话(这两个任务的名称相同)。现在,我想找到新会话的ProcessID来进行匹配,以匹配两个processID并杀死一个不是保存在我的第一个变量中的变量,但它不起作用,但是我收到了错误消息,变量“ PID “是只读的。有人对我有解决办法吗?
$NVCOverview = Get-Process vncviewer
$wshell = New-Object -ComObject wscript.shell;
start-sleep -Milliseconds 1000
(New-Object -ComObject WScript.Shell).AppActivate((get-process vncviewer).MainWindowTitle)
Start-Sleep -Milliseconds 100
$wshell.SendKeys("{TAB}")
Start-Sleep -Milliseconds 100
$wshell.SendKeys("{TAB}")
Start-Sleep -Milliseconds 100
$wshell.SendKeys("{ENTER}")
Start-Sleep -Milliseconds 5000
$newVncProcesses = get-process vncviewer | where {$_.Id -NotLike $NVCOverview[0]}
foreach ($pid in $newVncProcesses)
{
Stop-Process $pid
}
我希望循环会捕获neweset会话的ID并杀死它。
答案 0 :(得分:2)
$ PID是Powershell中的一个保留的自动变量,用于保存当前Powershell会话的进程ID,因此像消息提示的那样为只读。
将$ pid更改为$ id或类似的名称,它应该可以按预期工作。
详细了解the documentation中的许多自动变量,其中一些可能非常有用。
编辑:您的过滤器也有点过时,您只将当前对象的Id属性与原始变量的整个对象进行比较,并且使用零索引对包含以下内容的变量没有意义一个过程。这个:
$newVncProcesses = get-process vncviewer | where {$_.Id -NotLike $NVCOverview[0]}
应该看起来更像这样:
$newVncProcesses = get-process vncviewer | where {$_.Id -ne $NVCOverview.Id}