为上下文菜单编写 shell 命令时哪些特殊变量可用

Gio*_*Gio 56 windows windows-registry windows-7 command-line

当扩展 Windows 的 shell 上下文菜单时(例如,为了在目录上添加“在此处打开命令”提示),需要在注册表中创建一个“命令”键。

这个“命令”键的值显然可以是任何有效的命令行。

我想知道在此命令行中可以使用哪些“特殊变量”。

例如,我使用以下命令从目录的上下文菜单 (*) 中打开 cmd 窗口:

cmd.exe /e:on /f:on /s /k pushd "%V"
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于%V实际含义或此类变量的完整列表的参考。


(*) 为此创建了以下注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdshell]
@=Open Command Prompt Here"

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdshell\command]
@="cmd.exe /e:on /f:on /s /k pushd \"%V\""
Run Code Online (Sandbox Code Playgroud)

小智 70

通过注释克里斯Guzak扩展快捷菜单可用MSDN文章列出了各种“命令行变量”:

%* – 替换为所有参数。

%~ – 替换为以第二个参数开头和之后的所有参数。

%0 或 %1 – 第一个文件参数。例如“C:\Users\Eric\Desktop\New Text Document.txt”。通常这应该用引号引起来,应用程序命令行解析应该接受引号来消除名称中带有空格和不同命令行参数的文件的歧义(这是一种安全最佳实践,我相信在 MSDN 中提到过)。

%<n>(其中 <n> 是 2-9)——替换为第 n参数。

%s – 显示命令。

%h – 热键值。

%i – 存储在共享内存句柄中的 IDList 在此处传递。

%l – 第一个参数的长文件名形式。请注意,Win32/64 应用程序将获得长文件名,而 Win16 应用程序将获得短文件名。指定 %l 是首选,因为它避免了探测应用程序类型的需要。

%d – 第一个参数的桌面绝对解析名称(对于没有文件系统路径的项目)。

%v – 对于没有的动词意味着全部。如果没有传递参数,这是工作目录。

%w – 工作目录。

所以 %L 或 %l 应该是首选。

另见http://www.robvanderwoude.com/ntstart.php

  • 我不明白“对于没有的动词意味着全部”是什么意思。 (20认同)
  • 如果你想要目录名,应该使用 `%V`,即。当您想在单击背景而不是单个文件或目录名称时在上下文菜单上添加命令时。`%L` 在这种情况下不起作用。 (3认同)
  • 关于 `%W` 的警告:它并不总是可用,如果在你的 `command` 值中使用它会抛出一个神秘的错误消息。例如,在驱动器或库文件夹的上下文菜单上调用上下文菜单项不会初始化此变量。避免在文件处理程序的上下文菜单条目之外使用它。 (2认同)

Bil*_*3rd 14

这个问题引起了我的兴趣,所以我做了一些实验。我有一个文件夹C:\iso。当我做右键单击时我发现了什么:

D = C:\iso
H = 0
I = :115057472:7932
L = C:\iso
S = 1
V = C:\iso
W = C:\
Run Code Online (Sandbox Code Playgroud)

I每次尝试都返回一组不同的数字。H总是0,S总是1 DLV为所有的目标文件夹。W是目标文件夹的文件夹。有人关心扩展吗?

仅供参考:我使用以下注册表项进行测试:

[HKEY_CLASSES_ROOT\Directory\shell\testcmd]
@="Test Command Window Directory"
[HKEY_CLASSES_ROOT\Directory\shell\testcmd\command]
@="cmd.exe /k \"echo %A`%B`%C`%D`%E`%F`%G`%H`%I`%J`%K`%L`%M`%N`%O`%P`%Q`%R`%S`%T`%U`%V`%W`%X`%Y`%Z\""
Run Code Online (Sandbox Code Playgroud)

(` 字符用于分隔符)

  • 您是右键单击_in_文件夹还是_on_文件夹? (6认同)