匹配两个get-process变量不起作用

时间:2019-04-06 08:00:00

标签: powershell scripting

使用我的代码,我要获取一个名为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并杀死它。

1 个答案:

答案 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}