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

1

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

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


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

1

Пакетный интерпретатор анализирует командную строку немного иначе, чем анализатор чистой командной строки (прочитайте ответы на другой вопрос в StackOverflow):

  • командная строка: чтобы избежать расширения %MYAPPSDIR% помощью интерпретатора командной строки, символ % процента должен экранироваться стандартным escape-символом CLI (^ caret): ^%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
)

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .