我为任务栏创建了文件夹快捷方式,我希望他们每次都停止启动新的资源管理器
所以我决定创建一个批处理脚本,但我无法从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)
答案 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路径,但是它可以工作。当然,如果打开它,您甚至可以进一步更改它以切换到文件夹窗口