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

Я задал вопрос: используйте переменную окружения, чтобы указать на программу "Открыть с помощью", которая получила фантастический ответ. Добавить 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 файл будет?

Очки:

  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

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

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
)

Ресурсы (требуется чтение):

Как мне использовать параметр с удаленным.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 только до имени и расширения файла

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


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

Я отвечу на конкретный вопрос, который размещен:.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
Другие вопросы по тегам