首页 > 解决方案 > 匹配两个 get-process 变量不起作用

问题描述

使用我的代码,我想获取一个名为 VNCviewer 的程序的 ProcessID,然后我在这个程序中打开一个新会话,此时我已经获得了概览控制台的 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 并将其杀死。

标签: powershellscripting

解决方案


$PID 是 Powershell 中保留的自动变量,它保存当前 Powershell 会话的进程 ID,因此如消息所示为只读。

将 $pid 更改为 $id 或类似的东西,它应该像预期的那样工作。

请参阅文档中有关许多自动变量的更多信息,其中一些可能非常有用。

编辑:您的过滤器也有点偏离,您仅将当前对象的 Id 属性与原始变量的整个对象进行比较,并使用对包含单个进程的变量没有意义的零索引. 这个:

$newVncProcesses = get-process vncviewer | where {$_.Id -NotLike $NVCOverview[0]}

应该看起来更像这样:

$newVncProcesses = get-process vncviewer | where {$_.Id -ne $NVCOverview.Id}

推荐阅读