Какие специальные переменные доступны при написании команды оболочки для контекстного меню

46

При расширении контекстного меню оболочки Windows (например, для добавления приглашения «Открыть команду здесь» в каталогах) в реестре необходимо создать ключ «команда».

Значение этого «командного» ключа, очевидно, может быть любой допустимой командной строкой.

Я хочу знать, какие «специальные переменные» доступны для использования внутри этой командной строки.

Например, я использую следующую команду для открытия окна 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\""
Gio
источник

Ответы:

58

Комментарий Криса Гузака к статье 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

Juze
источник
18
Я не понимаю, что имеется в виду под «глаголами, которые не подразумевают всего».
Полковник Паник
2
Предупреждение о %W: Это не всегда доступно и выдаст загадочное сообщение об ошибке, если используется в вашем commandзначении. Например, вызов вашего элемента контекстного меню в контекстном меню диска или папки библиотеки не будет инициализировать эту переменную. Избегайте его использования вне элемента контекстного меню обработчика файлов.
Samthecodingman
Кто-нибудь пробовал %~? Я только получаю ошибку.
cdlvcdlv
2
%Vследует использовать, если вы хотите имя каталога, т.е. когда вы хотите добавить свою команду в контекстное меню, когда вы нажимаете на фон, а не на отдельный файл или имя каталога. %Lне будет работать в этом случае.
EnterTheNameHere Bohemian
11

Этот вопрос заинтриговал меня, поэтому я немного поэкспериментировал. У меня есть папка 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\""

(Символы были использованы для разделителей)

BillP3rd
источник
3
Вы щелкните правой кнопкой мыши в папке или на папку?
Полковник Паник
4

Вот аргументы / синтаксис для cmd.exe

/kвыполняет команду, указанную в следующей строке, поэтому она выполняет команду, pushd %V и поскольку единственный аргумент, который принимает pushd, - это путь, из которого следует, что %Vпеременная, доставляемая проводником, которая содержит путь к папке, нажатой правой кнопкой мыши.

Nifle
источник
1

Действительно, трудно найти, что означает% V или список этих переменных, с помощью Google я обнаружил, что, похоже, существует и% L. Я не думаю, что вам нужно передавать больше, чем% V или% L, хотя бы на подсказку, так как я думаю, что нет другой полезной информации. Где% V может быть именем каталога,% L может быть местоположением файла. Выполнение «эха» может помочь в случае сомнений ...

Тамара Вийсман
источник