我可以使用 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
我想用 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