我一直在搜索这些论坛几个小时,试图想出一种方法来编写一些我觉得比这更简单的东西。
所以这就是我要做的事情:
我的任务调度程序每两天运行一次脚本。该脚本打开文件夹的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)
答案 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()}