我可以使用 PowerShell 检查 windows 资源管理器 window 的状态吗?

Can I check the state of windows explorer window with PowerShell?

我想用 powershell 临时映射一个驱动器(我发现 this post 它给了我我需要的命令)然后打开一个 windows 资源管理器 window 显示那个驱动器.我想我可以使用 ii MyDrive:\MyPath\.

来做到这一点

我想,当我的 windows 资源管理器 window 被用户关闭时,解除映射之前映射的网络驱动器,然后停止 powershell 脚本。

问题 : 有什么方法可以检查 windows 资源管理器 window 的状态吗?


我应该提一下,我以前从未使用过 powershell,所以我对此了解不多。

您可以使用net use。像这样:

net use K: \servername\sharename /persistent:no

注销后不再映射驱动器

嘿,我没有得到解决方案, 但也许我的方法是解决问题的方法。

我玩了一下 .net 函数并获得了过程。 进程直接就没了,调用explorer后...

所以基函数是

[System.Diagnostics.Process]::Start("explorer.exe", "C:\")

什么returns过程:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName                                                                                                                                                      
-------  ------    -----      ----- -----   ------     --  -- -----------                                                                                                                                                      
      4       2      392       1140    10     0,00   6328   1 explorer  

里面还有一些功能,比如:

[System.Diagnostics.Process]::Start("explorer.exe", "C:\").WaitForExit()

但什么也没发生:(

如果将结果放入变量中,可以发现函数和属性:

$tmp = [System.Diagnostics.Process]::Start("explorer.exe", "C:\")

键入 $tmp。然后在 ISE

中点击 Strg + Space

然后我通过get-process cmd获取进程

$process = get-process -Id ([System.Diagnostics.Process]::Start("explorer.exe", "C:\")).Id

这导致我的过程如下:

> $process

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName                                                                                                                                                      
-------  ------    -----      ----- -----   ------     --  -- -----------                                                                                                                                                      
      0       1      384        120     6            8396   1 explorer                                                                                                                                                         

但同样:这个过程很快就消失了:(

我试了一下,得到了这个分辨率:

$path = "C:\temp\test"
$split = $path.split("\")
$mainWindowTitle = $split[$split.Length - 1]
$tmp = [System.Diagnostics.Process]::Start("explorer.exe", $path)
sleep -Seconds 2
Get-Process | ? ProcessName -eq explorer | select * | ? MainWindowTitle -eq $mainWindowTitle | select Id

有了这段代码,我就得到了你要找的过程。 让我给你解释一下。

首先我需要路径,以及其中的最后一个子目录。每个explorer Process都有一个mainWindowTitle,它的值就是打开的目录名。

所以我启动了explorer worth具体路径,并拆分出了最后一个子目录。您需要休眠 1 或 2 秒,因为进程需要一段时间才能进入进程列表。 然后我搜索了每个资源管理器 windowMainTitle 等于最后一个子目录。

所以现在你得到了 processId,允许你创建一个 while 循环,其中有一个睡眠,你可以在其中检查进程是否仍然存在。

唯一的问题是,window 无法打开两次或同名目录。

但也许您可以使用此代码。随便玩玩,看看你能想出什么。

编辑:

这段代码对我有用:)

$path = "C:\temp\test"
$split = $path.split("\")
$mainWindowTitle = $split[$split.Length - 1]
$tmp = [System.Diagnostics.Process]::Start("explorer.exe", $path)
sleep -Seconds 2
$processId = (Get-Process | ? ProcessName -eq explorer | select * | ? MainWindowTitle -eq $mainWindowTitle | select Id).Id
while((get-process -Id $processId ).Length -gt 0){
  sleep -Seconds 1
  $processId = (Get-Process | ? ProcessName -eq explorer | select * | ? MainWindowTitle -eq $mainWindowTitle | select Id).Id
}
# All code after will be executed after window was closed
write-host "Window Closed"

问候 Eldo.Ob