Как получить параметр в командном файле
Я задал вопрос: используйте переменную окружения, чтобы указать на программу "Открыть с помощью", которая получила фантастический ответ. Добавить myapp.exe
, проживающих в %MYAPPSDIR%
, чтобы открыть контекстное меню, я должен написать в CLI
reg add "HKCR\Applications\myapp.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\myapp\myapp.exe\" \"^%1\"" /f
Теперь я хочу иметь .bat
файл, получающий параметр, который выполняет это предложение. Например, выполнение regadd.bat myapp.exe
сделал бы это. Какая линия в .bat
файл будет?
Очки:
- Как включить параметр,
- Как включить параметр с
.exe
удалено (для части каталога), - Как избежать расширения
%1
что идет в реестр (я не знаю, как избежать этого соответственно).
Я нашел много ресурсов (например, Как использовать `%` в командном файле), но я не хотел бы возиться с реестром. Моя ставка на 1 и 3 (все равно придется отработать 2):
reg add "HKCR\Applications\%1\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\(%1 with .exe removed)\%1\" \"^%1\"" /f
Я мог бы также установить .bat
быть запущенным как regadd.bat myapp
, В этом случае строка будет
reg add "HKCR\Applications\%1.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\%1\%1.exe\" \"^%1\"" /f
Меня интересуют оба варианта.
3 ответа
Пакетный интерпретатор анализирует командную строку немного иначе, чем анализатор чистой командной строки (прочитайте ответы на другой вопрос в StackOverflow):
- командная строка: чтобы избежать расширения
%MYAPPSDIR%
интерпретатором командной строки,%
символ процента должен экранироваться стандартным экранирующим символом CLI (^
каретка):^%MYAPPSDIR^%
или же^%1
; .bat
сценарий: чтобы избежать расширения%MYAPPSDIR%
или же%1
пакетным переводчиком%
символ процента должен быть удвоен следующим образом:%%MYAPPSDIR%%
а также%%1
соответственно.
Чтобы различать параметры, предоставленные вашему пакетному сценарию:
set "par1=%~1"
if "%par1%"=="" (
echo no parameter supplied
goto :eof
) else (
set "par=%par1:.exe=%"
)
if "%par%"=="%par1%" (
echo .exe not present
) else (
echo .exe present
)
или (может лучше)
set "par1=%~1"
if "%par1%"=="" (
echo no parameter supplied
goto :eof
) else (
set "par=%par1:~-4%"
)
if /I "%par%"==".exe" (
echo .exe present
) else (
echo .exe not present
)
или (может быть, лучший)
set "par1=%~1"
if "%par1%"=="" (
echo no parameter supplied
goto :eof
) else (
set "par=%~x1"
)
if /I "%par%"==".exe" (
echo .exe present
) else (
echo .exe not present
)
Ресурсы (требуется чтение):
- (справочник по командам) Индекс AZ командной строки Windows CMD
- (дополнительные особенности) Синтаксис командной строки Windows CMD Shell
- (
%~1
и т.д. специальная страница) Аргументы командной строки (параметры) - (
%par1:~-4%
substring) Переменные: извлечь часть переменной - (
%par1:.exe=%
) Переменная Редактировать / Заменить
Как мне использовать параметр с удаленным.exe (для части каталога)?
Ты можешь использовать %~n1
,
Это расширяет %1
к имени файла без расширения файла.
Расширения параметров
Когда аргумент используется для предоставления имени файла, может применяться следующий расширенный синтаксис:
Мы используем переменную%1 (но это работает для любого параметра)
%~f1
- Разверните% 1 до полного имени пути - C:\utils\MyFile.txt
%~d1
- Развернуть% 1 только до буквы диска - C:
%~p1
- Развернуть% 1 только до пути, например, \utils\, включая завершающий \, который некоторые команды будут интерпретировать как escape-символ.
%~n1
- Разверните% 1 до имени файла без расширения файла C:\utils\MyFile или, если присутствует только путь (без обратной косой черты) - последняя папка в этом пути.
%~x1
- Развернуть% 1 только до файла eXtension -.txt
%~s1
- Измените значения f, n, s и x для ссылки на короткое имя 8.3 (если оно существует).
%~1
- Разверните% 1, удалив все окружающие кавычки (")
%~a1
- Показать атрибуты файла% 1
%~t1
- Показать дату / время% 1
%~z1
- Показать размер файла% 1
%~$PATH:1
- Найдите переменную среды PATH и разверните% 1 до полного имени первого найденного соответствия.Модификаторы выше могут быть объединены:
%~dp1
- Развернуть% 1 только до буквы и пути к диску
%~sp1
- Расширить% 1 до пути, сокращенного до 8,3 символа.
%~nx2
- Развернуть%2 только до имени и расширения файла
Исходные параметры
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- параметры - аргумент командной строки (или параметр) - это любое значение, переданное в пакетный скрипт.
Я отвечу на конкретный вопрос, который размещен:.bat
файл будет?, который был разделен на 3 необходимых шага.
JosefZ ответил отдельно на 3 пункта, приведших к ответу. ДэвидПостилл дал еще один вариант для пункта 2.
Полученный код будет
set "app1=%~1"
if "%app1%"=="" (
echo No parameter supplied. This should be run as
echo regadd.bat myapp.exe
echo or
echo regadd.bat myapp
goto :eof
) else (
REM set "app=%app1:.exe=%"
set "app=%~n1"
)
if "%app%"=="%app1%" (
REM echo .exe not present
) else (
REM echo .exe present
)
echo App is %app%
reg add "HKCR\Applications\%app%.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"%%MYAPPSDIR%%\%app%\%app%.exe\" \"%%1\"" /f