Berd's Playground

_(:з」∠)_

03/2
11:41
踩坑

Windows 运行 一些有趣的语法

0x00 前言

Windows Explorer 中有一个很实用的小工具 “运行” , 您可以用 Win+R 快捷键呼出这个小工具.

这个常用的小工具并不只是单纯的 “执行一个可执行程序”, 它其实有很多额外的功能. 通过这个工具执行命令与在任意资源管理器窗口的地址栏中输入命令是完全等价的, 本文就探讨一下这个小工具(地址栏)可用的一些语法.

由于网上很难找到资料, 本文无法涵盖所有可用的语法. 如果您了解更多有意思的语法欢迎与我交流.

0x01 执行一个可执行程序

首先自然要说我们最常用的运行方式了, 直接输入一个可执行程序的名称, 系统会根据环境变量搜寻并启动它. 当然您也可以输入绝对路径.

0x02 打开一个路径

由于使用运行和在资源管理器地址栏中进行输入一样, 如果您输入一个目录 (如 C:\Windows) 就会唤起一个新的资源管理器窗口指向您指定的路径. 当然, 您也可以打开所谓的 “网络路径”, 如 \\233.233.233.233.

0x03 打开一个URL

由于我对 Windows 处理 URL 的机制不了解, 这里只能讨论我观察到的现象. 在运行中输入一个 URL 将唤起对应 Scheme 的程序进行处理. 如 https:// 通常会唤起默认浏览器, 而 steam:// 会唤起 Steam 客户端.

0x04 一些特殊的语法

下面就是本文想讨论的一些有意思的语法了

1. 引用环境变量

相信不少人都知道这个, 只要输入一个存在的环境变量, 该变量会被解析成对应的值.

2. 启动系统特殊文件夹

这是比较有意思的一个语法, 通过 shell:<Key> 来打开一个系统的特殊文件夹. 网络上的资料大多都只提到 shell:startup 可以打开启动文件夹, 但是并没有提到其他的目录. 这也是本篇博客最开始想说的东西.

稍微研究了一下, 我发现这一语法的 Key 与 C# 的 Environment.SpecialFolder 是几乎完全一致的.

举个例子, 我们可以用 shell:Desktop 打开桌面目录, 用 shell:Personal 打开文档目录.

通常多个单词的键并非与该语法一一对应, 而是要适当的在词间加上空格. 例如 CommonStartMenu 就需要使用 shell:Common Start Menu, 同理 CDBurning 需要使用 shell:CD Burning 打开.

同时也有不遵守上一规则的键, 如 SendTo 文件夹可以直接使用 shell:SendTo 打开. 最后附上 Environment.SpecialFolders 的一些值, 取自 .Net Framework 4.5.2, 如果您有兴趣可以研究一下.

// 指定用于检索系统特殊文件夹的目录路径的枚举常数。
public enum SpecialFolder
{
	// 逻辑桌面,而不是物理文件系统位置。
	Desktop = 0,
	// 包含用户程序组的目录。
	Programs = 2,
	// 用作文档的公共储存库的目录。
	Personal = 5,
	// “我的文档”文件夹。
	MyDocuments = 5,
	// 用作用户收藏夹项的公共储存库的目录。
	Favorites = 6,
	// 对应于用户的“开始”程序组的目录。
	Startup = 7,
	// 包含用户最近使用过的文档的目录。
	Recent = 8,
	// 包含“发送”菜单项的目录。
	SendTo = 9,
	// 包含“开始”菜单项的目录。
	StartMenu = 11,
	// “我的音乐”文件夹。
	MyMusic = 13,
	// 充当属于某个用户的视频的存储库的文件系统目录。 已在 .NET Framework 4 中添加。
	MyVideos = 14,
	// 用于物理上存储桌面上的文件对象的目录。
	DesktopDirectory = 16,
	// “我的电脑”文件夹。
	MyComputer = 17,
	// 包含“网上邻居”虚拟文件夹中可能存在的链接对象的文件系统目录。 已在 .NET Framework 4 中添加。
	NetworkShortcuts = 19,
	// 包含字体的虚拟文件夹。 已在 .NET Framework 4 中添加。
	Fonts = 20,
	// 用作文档模板的公共储存库的目录。
	Templates = 21,
	// 包含在所有用户的“开始”菜单上都出现的程序和文件夹的文件系统目录。 此特殊文件夹仅对 Windows NT 系统有效。 已在 .NET Framework
	// 4 中添加。
	CommonStartMenu = 22,
	// 跨应用程序共享的组件的文件夹。 此特殊文件夹仅对 Windows NT、Windows 2000 和 Windows XP 系统有效。 已在 .NET Framework
	// 4 中添加。
	CommonPrograms = 23,
	// 包含在所有用户的“开始”文件夹中都出现的程序的文件系统目录。 此特殊文件夹仅对 Windows NT 系统有效。 已在 .NET Framework 4
	// 中添加。
	CommonStartup = 24,
	// 包含在所有用户桌面上出现的文件和文件夹的文件系统目录。 此特殊文件夹仅对 Windows NT 系统有效。 已在 .NET Framework 4 中添加。
	CommonDesktopDirectory = 25,
	// 用作当前漫游用户的应用程序特定数据的公共储存库的目录。
	ApplicationData = 26,
	// 包含“打印机”虚拟文件夹中可能存在的链接对象的文件系统目录。 已在 .NET Framework 4 中添加。
	PrinterShortcuts = 27,
	// 用作当前非漫游用户使用的应用程序特定数据的公共储存库的目录。
	LocalApplicationData = 28,
	// 用作 Internet 临时文件的公共储存库的目录。
	InternetCache = 32,
	// 用作 Internet Cookie 的公共储存库的目录。
	Cookies = 33,
	// 用作 Internet 历史记录项的公共储存库的目录。
	History = 34,
	// 用作所有用户使用的应用程序特定数据的公共储存库的目录。
	CommonApplicationData = 35,
	// Windows 目录或 SYSROOT。 它与 %windir% 或 %SYSTEMROOT% 环境变量相对应。 已在 .NET Framework 4
	// 中添加。
	Windows = 36,
	// “System”目录。
	System = 37,
	// “Program files”目录。 在非 x86 系统中,将 System.Environment.SpecialFolder.ProgramFiles
	// 传递到 System.Environment.GetFolderPath(System.Environment.SpecialFolder) 方法将返回非
	// x86 程序的路径。 若要在非 x86 系统上获取 x86 程序文件目录,请使用 System.Environment.SpecialFolder.ProgramFilesX86
	// 成员。
	ProgramFiles = 38,
	// “我的图片”文件夹。
	MyPictures = 39,
	// 用户的配置文件文件夹。 应用程序不应在此级别上创建文件或文件夹;它们应将其数据放在 System.Environment.SpecialFolder.ApplicationData
	// 所引用的位置之下。 已在 .NET Framework 4 中添加。
	UserProfile = 40,
	// Windows“System”文件夹。 已在 .NET Framework 4 中添加。
	SystemX86 = 41,
	// X86 Program Files 文件夹。 已在 .NET Framework 4 中添加。
	ProgramFilesX86 = 42,
	// 用于应用程序间共享的组件的目录。 若要在非 x86 系统上获取 x86 常规程序文件目录,请使用 System.Environment.SpecialFolder.ProgramFilesX86
	// 成员。
	CommonProgramFiles = 43,
	// “Program Files”文件夹。 已在 .NET Framework 4 中添加。
	CommonProgramFilesX86 = 44,
	// 包含所有用户都可以使用的模板的文件系统目录。 此特殊文件夹仅对 Windows NT 系统有效。 已在 .NET Framework 4 中添加。
	CommonTemplates = 45,
	// 包含所有用户共有的文档的文件系统目录。 此特殊文件夹仅对装有 Shfolder.dll 的 Windows NT 系统、Windows 95 和 Windows
	// 98 系统有效。 已在 .NET Framework 4 中添加。
	CommonDocuments = 46,
	// 包含计算机所有用户的管理工具的文件系统目录。 已在 .NET Framework 4 中添加。
	CommonAdminTools = 47,
	// 用于存储各个用户的管理工具的文件系统目录。 Microsoft Management Console (MMC) 会将自定义的控制台保存在此目录中,并且此目录将随用户一起漫游。
	// 已在 .NET Framework 4 中添加。
	AdminTools = 48,
	// 充当所有用户共有的音乐文件的存储库的文件系统目录。 已在 .NET Framework 4 中添加。
	CommonMusic = 53,
	// 充当所有用户共有的图像文件的存储库的文件系统目录。 已在 .NET Framework 4 中添加。
	CommonPictures = 54,
	// 充当所有用户共有的视频文件的存储库的文件系统目录。 已在 .NET Framework 4 中添加。
	CommonVideos = 55,
	// 包含资源数据的文件系统目录。 已在 .NET Framework 4 中添加。
	Resources = 56,
	// 包含本地化资源数据的文件系统目录。 已在 .NET Framework 4 中添加。
	LocalizedResources = 57,
	// 为了实现向后兼容,Windows Vista 中可以识别此值,但该特殊文件夹本身已不再使用。 已在 .NET Framework 4 中添加。
	CommonOemLinks = 58,
	// 充当等待写入 CD 的文件的临时区域的文件系统目录。 已在 .NET Framework 4 中添加。
	CDBurning = 59
}

Windows 运行 一些有趣的语法