【问题标题】:How to determine if a specific Windows shell folder is open via Batch commands如何通过批处理命令确定是否打开了特定的 Windows shell 文件夹
【发布时间】:2020-01-29 11:00:47
【问题描述】:

我有一个批处理程序,它可以按特定顺序打开程序和文件,因此当我登录计算机时,我什至无需单击即可打开所有内容。此脚本将在冷启动时自动运行,并且通过调整答案,可以运行脚本以简单地打开尚未打开的窗口而不会创建重复项。

通过确定程序是否已经在运行,这段代码几乎可以完美地满足我的所有需求:

SETLOCAL EnableExtensions
set EXE=notepad++.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
start C:\MEDIA\OFFICE\Notepad++\notepad++.exe
goto FIN
:FOUND
echo Notepad++ is already running.
:FIN

但是我不确定如何使用这种方法(或存在哪些替代方法)来告诉我以下特定的 shell 文件夹是否打开。

所需/工作路径 (My Documents) 是:

start %windir%\explorer.exe shell:UsersFilesFolder\JAB Creations

绝对路径(My Computer)是:

D:\My Documents\JAB Creations

重要说明

  • 目录是一个符号链接,那个命令如果你好奇的话是Mklink /J "C:\Users\John\JAB Creations" "D:\My Documents\JAB Creations"
  • 我确实要使用绝对路径,我要My Documents下打开的目录,My Computer
  • 我已经删除了 Windows 资源管理器中的垃圾条目,例如 LibrariesQuick Access,我使用了 My Documents(现在称为 User Files)。此命令通过My Documents 打开目录,而不是在示例中将其列在My Computer 下。
  • 如果您正在测试,则需要在Folder Options 窗口的View 选项卡下启用Expand to open folderShow all folders 选项,否则默认隐藏有用的目录。

重要的先决条件

首先修复文件夹选项,否则尝试毫无意义:

其次,这是视觉上应该发生的:

【问题讨论】:

  • 如果你用它来“在我登录计算机时,无需单击即可打开所有内容”,你的程序怎么可能已经打开了?当我登录时,桌面和任务栏始终是空的,这表明我没有运行任何窗口程序。
  • 登录后谁会在您运行脚本之前打开您的文件夹?无论如何,opening a folder explorer if it wasn't opened 已经有一个重复的问题。但我认为您无法检查它是否在“我的电脑”或“我的文档”的上下文中打开,除非您将调试器附加到 explorer.exe
  • 约翰,我对 explorer 的工作原理非常了解,并且已经完整阅读了您的问题。您发布了不相关的工作代码,此外,您还向我们提供了有关符号链接和重命名/重定向路径的不必要信息。奇怪的是,我自己和@phuclv 似乎都缺乏理解力,不是吗?我们都注意到,在登录时,您的特定窗口进程不应该已经打开,并且不能使用标准批处理文件命令来完成。您正在寻找一个题外话“我该怎么做?”答案,但 StackOverflow 与一般编程无关。
  • 你的问题跑题了。它是一种通用编程,本网站针对您提供的代码的特定问题提供帮助。请求对软件(即调试器)的建议也是题外话。
  • 说了算,不胜现场指导!

标签: batch-file windows-10 windows-shell


【解决方案1】:

在 Windows 10 中,explorer.exe 默认提供 N/A 的窗口标题,但如果您要启动这些资源管理器实例,则有一种解决方法。

定期打开资源管理器(通过运行 explorer.exe 或打开图标)将导致以下标题查询:

C:\Users\***>tasklist /fi "imagename eq explorer.exe" /fo list /v
Image Name:   explorer.exe
PID:          5320
Session Name: Console
Session#:     1
Mem Usage:    141,516 K
Status:       Running
User Name:    ***\***
CPU Time:     0:31:41
Window Title: N/A

使用标题标志(甚至不需要指定字符串)启动 explorer.exe 时,将强制资源管理器保持其标题值准确。所以在你上面的代码中,像这样调用 explorer.exe:

C:\Users\***>explorer.exe /Title

这将导致我们的标题查询返回实际标题(以及当前打开的文件夹):

Image Name:   explorer.exe
PID:          13888
Session Name: Console
Session#:     1
Mem Usage:    45,964 K
Status:       Running
User Name:    ***\***
CPU Time:     0:00:00
Window Title: Documents

所以现在您需要做的就是使用tasklist /fi "imagename eq explorer.exe" /fo list /v 查询资源管理器的所有实例,并解析返回的数据以获得您希望识别的文件夹名称,如下所示(我检查标题中的“文档”):

C:\Users\***>tasklist /fi "imagename eq explorer.exe" /fo list /v | find "Documents"
Window Title: Documents

C:\Users\***>

上述查询将返回 0 码或 1 码表示找到/未找到。您可以使用它来检查您的代码是否在 Windows 资源管理器 (.exe) 中打开了特定文件夹。我希望这能让您很好地掌握 Windows 10 古怪的资源管理器用法!

【讨论】:

  • 问题是,如果之前没有/Title 打开该文件夹,那么您的方法将不起作用。使用Shell.Windows().item().LocationUrl 更可靠。而且您的解决方案仍然无法区分打开文件夹(我的文档或我的电脑)的上下文
  • 有趣!我对此进行了测试,我喜欢这个想法,尽管在尝试使用 /title 标志并将 shell 命令与不同顺序的引号结合起来之后,它总是要么忽略 shell 命令,要么打开另一个命令提示符。运行explorer.exe时如何将/titleshell:UsersFilesFolder\JAB Creations结合起来?
  • 嗨,约翰,我尝试通过 shell 启动资源管理器,看看你的意思是什么,只是打开一个新的命令提示符。奇怪的。我建议的以下文件夹打开行的解决方案(和简化)。将 start %windir%\explorer.exe shell:UsersFilesFolder\JAB Creations 更改为 "explorer "//" /Title"。 “//”是“我的文档”默认位置的简写。
  • 更正:explorer "//" /Title(注意我删除了最外面的引号)
  • start %windir%\explorer shell:UsersFilesFolder\JAB Creations "//" /Title 不起作用。我在底部附近的问题中的“文件夹选项”中添加了有关“显示所有文件夹”和“扩展到当前文件夹”的说明。请您尝试调整它并使用shell:UsersFilesFolder\Documents 进行测试吗?我觉得我们真的很亲密,我希望能够接受答案。 :D
猜你喜欢
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多