【问题标题】:Get Explorer's children in batch批量获取 Explorer 的孩子
【发布时间】:2018-06-13 12:45:09
【问题描述】:

我为我的任务栏创建了文件夹快捷方式,我希望它们不再每次都启动新的资源管理器

所以我决定创建一个批处理脚本,但是我无法从 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 C:\Users\danil\Desktop\ISO 感到困惑。
  • explorer.exe 窗口不是单独的进程,因此您将无法使用任务列表列出它们。
  • 你想对所有你想列出的窗口做什么?如果“文件夹”还没有打开,你想启动它吗?

标签: windows batch-file directory explorer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您无法通过检查命令行选项来检查打开的文件夹,因为即使您在该窗口中更改为其他一些文件夹,参数在进程的整个生命周期内都保持不变。您需要使用scriptable shell objects 获取当前地址。

    如果文件夹尚未在资源管理器中打开,这是一个 PowerShell 脚本,用于打开文件夹

    $folder = 'C:\Users\danil\Desktop\ISO'
    $folderOpened = $false
    foreach ($w in (New-Object -ComObject Shell.Application).Windows()) {
        if ($w.LocationURL -ieq ([uri]$folder).AbsoluteUri) { $folderOpened = $true; break }
    }
    if (-not $folderOpened) { Invoke-Item $folder } # or start $folder
    

    下面是一个等效的混合批处理-jscript sn-p

    @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 路径,但它可以工作。当然,如果它正在打开,您甚至可以进一步更改它以切换到文件夹窗口。您还可以使用 VBS 或任何其他支持脚本化 shell 对象的语言

    【讨论】:

      猜你喜欢
      • 2013-09-27
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      相关资源
      最近更新 更多