我为我的任务栏创建了文件夹快捷方式,我希望他们每次都停止启动一个新的资源管理器
所以我决定创建一个批处理脚本,但我无法从explorer.exe中获取孩子
@echo off
pushd
tasklist /nh /fi "imagename eq explorer.exe C:\Users\danil\Desktop\ISO" | find /i "explorer.exe C:\Users\danil\Desktop\ISO" > nul ||(start explorer.exe C:\Users\danil\Desktop\ISO)
您尝试的问题是,任务列表将仅列出explorer.exe
的一个实例,但不会列出每个打开的窗口的标题。
通过对this的一些编辑,我创建了listWindows.bat - 它将列出所有可见的窗口名称及其相应的可执行文件。所以你可以尝试这个:
call listWindows.bat|findstr /i /b /e "explorer::Downloads" >nul 2>nul || (
start "" explorer.exe "C:\Users\%username%\Downloads"
)
要检查您需要启动的窗口,您可以尝试这样做:
call listWindows.bat|findstr /i /b "explorer::"
您无法通过检查命令行选项来检查打开文件夹,因为即使您更改为该窗口中的某些其他文件夹,参数在整个过程中也保持不变。你需要使用scriptable shell objects来获取地址。下面是一个混合的batch-jscript片段,用于打开文件夹(如果尚未在资源管理器中打开)
@if (@CodeSection == @Batch) @then
@echo off
cscript //e:jscript //nologo "%~f0" %*
exit /b
@end
// JScript Section
var objShell = new ActiveXObject("shell.application");
var objShellWindows;
objShellWindows = objShell.Windows();
if (objShellWindows != null)
{
var folder = "file:///C:/Users/danil/Desktop/ISO"; // the folder you want to open
var folderOpened = 0;
for (var objEnum = new Enumerator(objShellWindows); !objEnum.atEnd(); objEnum.moveNext())
{
if (folder == objEnum.item().LocationUrl)
{
folderOpened = 1;
break;
}
}
if (!folderOpened) // open the folder if it's not already opened
objShell.Explore(folder); // or objshell.Open(folder)
}
每个资源管理器窗口都由InternetExplorer
对象表示,该对象可以从Shell.Windows()
集合中检索。您需要使用file URI scheme而不是正常的Windows路径,但它可以工作。当然,如果正在打开文件夹窗口,您甚至可以进一步更改它以切换到文件夹窗口