我问了一个问题,使用环境变量指向“打开方式”程序,获得了很棒的答案. 添加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
是什么?
要点如下:
- 如何包含参数,
- 如何包含
.exe
已删除的参数(对于目录部分), - 如何避免扩展
%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
)
资源(必读):
- (命令参考)Windows CMD 命令行的 AZ 索引
- (其他细节)Windows CMD Shell 命令行语法
- (
%~1
等专题页面)命令行参数(参数) - (
%par1:~-4%
子字符串)变量:提取变量的一部分 - (
%par1:.exe=%
)变量编辑/替换
答案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 扩展为文件名和扩展名
来源参数
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 参数- 命令行参数(或参数)是传递到批处理脚本的任何值。
答案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