如何在批处理文件中接收参数

如何在批处理文件中接收参数

我问了一个问题,使用环境变量指向“打开方式”程序,获得了很棒的答案. 添加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

我对这两个选择都感兴趣。

答案1

批处理解释器解析命令行的方式与纯命令行解析器略有不同(阅读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
)

资源(必读):

答案2

如何使用删除了.exe 的参数(对于目录部分)?

您可以使用%~n1

这将扩展%1为没有文件扩展名的文件名。


参数扩展

当使用参数来提供文件名时,可以应用以下扩展语法:

我们正在使用变量 %1(但这适用于任何参数)

  • %~f1- 将 %1 扩展为完全限定路径名 - C:\utils\MyFile.txt

  • %~d1- 仅将 %1 扩展为驱动器号 - C:

  • %~p1- 将 %1 仅扩展为路径,例如 \utils\,这包括尾随的 \,某些命令会将其解释为转义字符。

  • %~n1- 将 %1 扩展为不带文件扩展名的文件名 C:\utils\MyFile,或者如果仅存在路径(没有尾随反斜杠) - 则为该路径中的最后一个文件夹。

  • %~x1- 将 %1 扩展为仅文件扩展名 - .txt

  • %~s1- 更改 f、n、s 和 x 的含义以引用 Short 8.3 名称(如果存在)。

  • %~1- 展开 %1 并删除所有周围的引号 (")

  • %~a1- 显示 %1 的文件属性

  • %~t1- 显示%1的日期/时间

  • %~z1- 显示 %1 的文件大小

  • %~$PATH:1- 搜索 PATH 环境变量并将 %1 扩展为找到的第一个匹配项的完全限定名称。

上面的修饰符可以组合使用:

  • %~dp1- 仅将 %1 扩展为驱动器号和路径

  • %~sp1- 将 %1 扩展为缩短为 8.3 个字符的路径

  • %~nx2- 仅将 %2 扩展为文件名和扩展名

来源参数


进一步阅读

答案3

我将回答发布的具体问题: 文件中的行应该.bat是什么?,分为 3 个必要步骤。

约瑟夫已回答分别列出 3 个引向答案的要点。DavidPostill给了另一个选择对于第 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

相关内容