【问题标题】:Can I check the state of windows explorer window with PowerShell?我可以使用 PowerShell 检查 Windows 资源管理器窗口的状态吗?
【发布时间】:2016-10-06 09:26:20
【问题描述】:

我想用 powershell 临时映射一个驱动器(我找到了this post,它给了我需要的命令),然后打开一个显示该驱动器的 Windows 资源管理器窗口。我想我可以使用 ii MyDrive:\MyPath\ 来做到这一点。

我想,当我的 Windows 资源管理器窗口被用户关闭时,取消映射之前映射的网络驱动器,然后停止 powershell 脚本。

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


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

【问题讨论】:

  • 这并不容易。即使启动一个新实例,它也只会很快出现,告诉另一个进程打开那个窗口。所以你不能轻易看出你开始的那个是否还在。这取决于默认关闭的“在单独的进程中启动文件夹窗口”设置。另一种选择是寻找具有正确标题的窗口,但这是一种脆弱的方法,将来可能会中断,如果他们在该窗口中打开不同的文件夹,你会错误地断定它已经消失了。 TL;DR: PowerShell 与否,正确并非易事,而且出错的可能性大于正确。

标签: powershell windows-explorer


【解决方案1】:

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

我玩了一下 .net 函数并了解了过程。 进程直接没了,调用资源管理器后...

所以基函数是

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

什么返回进程:

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

使用此代码,我得到了您正在寻找的流程。 让我给你解释一下。

首先我需要路径,以及其中的最后一个子目录。每个资源管理器进程都有一个 mainWindowTitle,其值为打开的目录的名称。

所以我启动了带有特定路径的资源管理器,并拆分了最后一个子目录。您需要睡眠 1 或 2 秒,因为进程需要一段时间才能进入进程列表。 然后我搜索了每个资源管理器,其中 windowMainTitle 等于最后一个子目录。

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

唯一的问题是,窗口不能打开两次或同名目录。

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

编辑:

这段代码对我有用:)

$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"

Greetz Eldo.Ob

【讨论】:

  • 问题:我尝试了通常在其他 IDE 中使用的每个快捷方式,例如 Ctrl+Space,但它在我的 powershell ISE 上不起作用,我不明白您所说的“Strg”是什么意思。你能说出你的意思吗?
  • 哦抱歉 strg 是德国的 xD I ment ctrl。这是一种自动完成。如果你输入 get- 然后按 ctrl + space 它应该会给你一个可用命令的列表。但它只有在没有脚本运行时才有效。
  • x) 那就麻烦了,因为 Ctrl+Space 只是在我的脚本中放了一个空格......我没有运行脚本。我知道这个快捷方式应该可以工作,因为我之前在运行 Windows Server 2008 R2 的虚拟机上使用过它...
  • hmm intellisense 是我要找的词:Intellisense
  • 嗯,我在win7 sp1上工作,你的文章涉及自win8以来的操作系统.. x)
【解决方案2】:

您可以使用网络使用。像这样:

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

注销后驱动器不再映射

【讨论】:

  • 他们想在资源管理器窗口关闭后删除映射,而不是在注销时。
  • 你用powershell启动资源管理器窗口吗?
  • 基本上我想将用户连接到受权限保护的驱动器,但我不想给他权限。因此我需要用密码连接他,但我不想让他知道密码。我认为使用 powershell 可以让我做到这一点。
  • 关闭窗口后驱动断开连接是否有必要?
  • @guiwhatsthat - 这并不容易,运行Start-Process explorer.exe 不会创建新进程,它只是打开现有explorer.exe 进程的新窗口。 Explorer 在这方面很特别。在用户注销之前,资源管理器进程永远不会消失。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 2017-01-28
  • 2011-03-11
  • 2016-04-17
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多