通过改变ID或文件名关闭资源管理器窗口

时间:2016-05-02 22:00:00

标签: powershell

我一直在搜索这些论坛几个小时,试图想出一种方法来编写一些我觉得比这更简单的东西。

所以这就是我要做的事情: 我的任务调度程序每两天运行一次脚本。该脚本打开文件夹的explorer.exe路径,然后删除该文件夹中的所有文件。当我不在办公室时,调度程序在晚上运行脚本。但是,当我进入办公室时,浏览器窗口对该页面是开放的。琐碎,我知道 - 但我不想看到那个窗口打开,所以我希望脚本运行,然后关闭窗口,所以我什么也看不见。

我已经尝试过这一切。当我尝试做一些简单的事情,比如

$var1 = invoke-item C:\path\file
$var1.quit()

$var1.close()

但是当我这样做时,我收到一条错误消息,指出该变量为null。

然后我尝试停止这个过程。但是我不希望所有的资源管理器文件都关闭,只关闭那个特定的资源管理器窗口。所以为了做到这一点,我必须知道窗口的ID。但由于该特定窗口的ID不是静态的,我需要获取进程ID - 将其分配给变量 - 然后使用变量使用stop-process cmdlet。

这就是我现在正在尝试的事情:

get-process | where-object {$_.MainWindowTitle -eq "filename"} | select -property id | $var2

然而,当我运行这个脚本时,它仍然说该变量为null。

那么如何为变量赋值?或者,如果有人有更好的关闭特定窗口的方法。

(我已尝试仅使用stop-process使用mainwindowtitle - 但它仍然想要一个ID)

2 个答案:

答案 0 :(得分:3)

如果您确实要关闭特定的文件资源管理器窗口,则需要使用Shell.Application。列表打开文件资源管理器窗口:

$shell = New-Object -ComObject Shell.Application
$shell.Windows() | Format-Table Name, LocationName, LocationURL

Name          LocationName LocationURL           
----          ------------ -----------           
File Explorer Windows      file:///C:/Windows    
File Explorer folder       file:///C:/path/folder

我想关闭c:\path\folde中的那个,所以让我们找到并关闭它:

$shell = New-Object -ComObject Shell.Application
$window = $shell.Windows() | Where-Object { $_.LocationURL -like "$(([uri]"c:\path\folder").AbsoluteUri)*" }
$window | ForEach-Object { $_.Quit() }

然而,正如评论中所提到的,你过于复杂了。 PowerShell的目的是使其自动化,这通常意味着您根本不想使用GUI。我不确定你想删除或保留等等,但这里有一个你可以使用的样本:

#Get contents of folder (not recursive)
Get-ChildItem -Path 'c:\path\folder' |
#Only files
Where-Object { !$_.PSIsContainer } |
#Remove...
Remove-Item

答案 1 :(得分:0)

# Close specific window, when folder path contains cyrillic symbols
$folder = "D:\folder"
$shell = New-Object -ComObject Shell.Application
$window = $shell.Windows() | Where-Object {$_.LocationURL -eq "file:///"+([uri]$folder.Replace("\","/")).OriginalString}
$window | ForEach-Object -Process {$_.Quit()}