Como receber um parâmetro em um arquivo em lotes

0

Eu fiz uma pergunta, Use uma variável de ambiente para apontar para um programa "Abrir com" , que recebeu um resposta fantástica. Para adicionar myapp.exe , residindo em %MYAPPSDIR% , no menu de contexto Abrir com, eu deveria escrever no CLI

reg add "HKCR\Applications\myapp.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\myapp\myapp.exe\" \"^%1\"" /f

Agora eu quero ter um arquivo .bat , recebendo um parâmetro, que executa a sentença. Por exemplo, executar regadd.bat myapp.exe faria isso. Qual deve ser a linha no arquivo .bat ?

Os pontos são:

  1. Como incluir o parâmetro
  2. Como incluir o parâmetro com .exe removed (para a parte do diretório),
  3. Como evitar a expansão de %1 que entra no registro (não sei como escapar adequadamente).

Eu encontrei muitos recursos (por exemplo, Como usar '%' em um arquivo de lote ), mas eu não Não gosto de mexer com o registro. Minha aposta para 1 e 3 é (ainda tenho que resolver 2):

reg add "HKCR\Applications\%1\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\(%1 with .exe removed)\%1\" \"^%1\"" /f

Eu também poderia definir o .bat para ser executado como regadd.bat myapp . Nesse caso, a linha seria

reg add "HKCR\Applications\%1.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\%1\%1.exe\" \"^%1\"" /f

Estou interessado em ambas as opções.

    
por sancho.s 25.06.2015 / 10:12

3 respostas

1

O interpretador de lote analisa a linha de comando de uma maneira ligeiramente diferente do que o analisador de linha de comando puro (leia respostas a outra pergunta no StackOverflow ) :

  • linha de comando : para evitar a expansão de %MYAPPSDIR% pelo interpretador de linha de comando, o caractere % porcento deve ser protegido pelo caractere de escape da CLI padrão ( ^ caret): ^%MYAPPSDIR^% ou ^%1 ;
  • .bat script : para evitar a expansão de %MYAPPSDIR% ou %1 pelo intérprete em lote, o caractere % percent deve ser dobrado da seguinte forma: %%MYAPPSDIR%% e %%1 , respectivamente.

Para distinguir os parâmetros fornecidos ao seu script em lote:

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
)

ou (talvez melhor)

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
)

ou (talvez o melhor)

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
)

Recursos (leitura obrigatória):

por 25.06.2015 / 10:48
1

Como faço para usar o parâmetro com .exe removido (para a parte do diretório)?

Você pode usar %~n1 .

Isso expande %1 para um nome de arquivo sem a extensão do arquivo.

Extensões de Parâmetro

When an argument is used to supply a filename then the following extended syntax can be applied:

We are using the variable %1 (but this works for any parameter)

  • %~f1 - Expand %1 to a Fully qualified path name - C:\utils\MyFile.txt

  • %~d1 - Expand %1 to a Drive letter only - C:

  • %~p1 - Expand %1 to a Path only e.g. \utils\ this includes a trailing \ which will be interpreted as an escape character by some commands.

  • %~n1 - Expand %1 to a file Name without file extension C:\utils\MyFile or if only a path is present (with no trailing backslash) - the last folder in that path.

  • %~x1 - Expand %1 to a file eXtension only - .txt

  • %~s1 - Change the meaning of f, n, s and x to reference the Short 8.3 name (if it exists.)

  • %~1 - Expand %1 removing any surrounding quotes (")

  • %~a1 - Display the file attributes of %1

  • %~t1 - Display the date/time of %1

  • %~z1 - Display the file size of %1

  • %~$PATH:1 - Search the PATH environment variable and expand %1 to the fully qualified name of the first match found.

The modifiers above can be combined:

  • %~dp1 - Expand %1 to a drive letter and path only

  • %~sp1 - Expand %1 to a path shortened to 8.3 characters

  • %~nx2 - Expand %2 to a file name and extension only

Fonte parâmetros

Leitura Adicional

por 30.07.2015 / 13:01
0

Eu responderei a pergunta específica postada: Qual deve ser a linha no arquivo .bat ? , que foi dividido em 3 etapas necessárias.

JosefZ respondeu separadamente aos 3 pontos que levam à resposta. DavidPostill deu outra opção para o ponto 2.

O código resultante seria

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
    
por 30.07.2015 / 13:13