Как получить параметр в командном файле

2071
sancho.s

Я задал вопрос: используйте переменную окружения, чтобы указать на программу «Открыть с помощью», которая получила фантастический ответ. Чтобы добавить myapp.exe, находясь в %MYAPPSDIR%, в контекстное меню Open With, я должен написать в 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файле?

Очки:

  1. Как включить параметр,
  2. Как включить параметр с .exeудаленным (для части каталога),
  3. Как избежать расширения, %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 

Меня интересуют оба варианта.

0

3 ответа на вопрос

1
JosefZ

Batch interpreter parses command line in slightly different manner than pure command line parser (read answers to another question at StackOverflow):

  • command line: to avoid expanding %MYAPPSDIR% by command line interpreter, the % percent character should be escaped by the standard CLI escape character (^ caret): ^%MYAPPSDIR^% or ^%1;
  • .bat script: to avoid expanding %MYAPPSDIR% or %1 by batch interpreter, the % percent character should be doubled as follows: %%MYAPPSDIR%% and %%1, respectively.

To distinguish parameters supplied to your batch script:

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 ) 

or (maybe better)

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 ) 

or (maybe the best)

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 ) 

Resources (required reading):

Благодарю. Как насчет пункта 2? sancho.s 8 лет назад 0
@ sancho.s Использовать `% ~ n1` - расширяет`% 1` до имени файла без расширения файла. См. [Аргументы командной строки (параметры)] (http://ss64.com/nt/syntax-args.html) для этого и других расширений параметров. DavidPostill 8 лет назад 1
Очень подробный ответ! Я проверю варианты и оставлю отзыв. sancho.s 8 лет назад 0
Отзыв № 1: Я не знаю, почему вы установили 3 уровня «достоинства» для своих решений (возможно, вы могли бы прокомментировать причины). Во всяком случае, для предполагаемого использования, как было опубликовано в OP, я обнаружил, что первый из них полезен, поскольку он позволяет извлекать имя приложения без .exe для дальнейшего использования. Следующие две альтернативы только определяют наличие .exe, но не изолируют имя приложения. sancho.s 8 лет назад 0
@DavidPostill - Ваш комментарий заслуживает ответа. sancho.s 8 лет назад 0
Ниже я добавил краткий ответ с соответствующей строкой кода, http://superuser.com/a/947474/245595. sancho.s 8 лет назад 0
1
DavidPostill

Как мне использовать параметр с удаленным .exe (для части каталога)?

Вы можете использовать %~n1.

Это расширяется %1до имени файла без расширения файла.


Расширения параметров

Когда аргумент используется для указания имени файла, может применяться следующий расширенный синтаксис:

Мы используем переменную% 1 (но это работает для любого параметра)

  • %~f1 - Разверните% 1 до полного имени пути - C: \ utils \ MyFile.txt

  • %~d1 - Развернуть% 1 только до буквы диска - C:

  • %~p1 - Развернуть% 1 до пути только, например, \ utils \, включая завершающий символ \, который будет интерпретирован как управляющий символ некоторыми командами.

  • %~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 только до имени и расширения файла

Исходные параметры


Дальнейшее чтение

0
sancho.s

Я отвечу на конкретный вопрос: какой должна быть строка в .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