分批获取资源管理器的子项

问题描述 投票:1回答:1

我为我的任务栏创建了文件夹快捷方式task bar shortcuts,我希望他们每次都停止启动一个新的资源管理器

Multiple windows of the same folder in explorer

所以我决定创建一个批处理脚本,但我无法从explorer.exe中获取孩子

task manager

@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)
batch-file explorer
1个回答
0
投票

您尝试的问题是,任务列表将仅列出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::"

0
投票

您无法通过检查命令行选项来检查打开文件夹,因为即使您更改为该窗口中的某些其他文件夹,参数在整个过程中也保持不变。你需要使用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路径,但它可以工作。当然,如果正在打开文件夹窗口,您甚至可以进一步更改它以切换到文件夹窗口

© www.soinside.com 2019 - 2024. All rights reserved.