当扩展 Windows 的 shell 上下文菜单(例如,在目录上添加“在此处打开命令”提示)时,需要在注册表中创建一个“命令”键。
这个“命令”键的值显然可以是任何有效的命令行。
我想知道哪些“特殊变量”可用于这个命令行。
例如,我使用以下命令从目录的上下文菜单 (*) 中打开一个 cmd 窗口:
cmd.exe /e:on /f:on /s /k pushd "%V"
我找不到任何关于其%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\""
答案1
评论来自克里斯·古扎克在扩展快捷菜单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。
答案2
这个问题引起了我的兴趣,所以我做了一些实验。我有一个文件夹C:\iso
。当我右键单击时,我发现了以下内容:
D = C:\iso
H = 0
I = :115057472:7932
L = C:\iso
S = 1
V = C:\iso
W = C:\
I
每次尝试都返回一组不同的数字。H
始终为 0,S
始终为 1。D
、、L
和V
都是目标文件夹。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\""
(` 字符用于分隔符)
答案3
/k
执行以下字符串指定的命令,因此它执行该命令pushd %V
,并且由于唯一的pushd 接受的参数是一条路径,它遵循%V
由资源管理器传递的变量,其中包含右键单击的文件夹的路径。
答案4
确实很难找到 %V 的含义或这些变量的列表,通过 Google 我发现似乎也存在 %L。我认为您不必向提示传递超过 %V 或 %L 的信息,因为我认为没有其他有用的信息。其中 %V 可能是目录名称,而 %L 可能是文件的位置。如果有疑问,执行“echo”可能会有所帮助...