分批获取资源管理器中的孩子

时间:2018-01-03 19:51:45

标签: windows batch-file directory explorer

我为任务栏创建了文件夹快捷方式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)

2 个答案:

答案 0 :(得分: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::"

答案 1 :(得分: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)
}

每个资源管理器窗口均由Shell.Windows()集合中的InternetExplorer对象表示。您需要使用file URI scheme而不是普通的Windows路径,但是它可以工作。当然,如果打开它,您甚至可以进一步更改它以切换到文件夹窗口

相关问题