如何为自定义 BAT 文件创建 HELP 命令?
Posted
技术标签:
【中文标题】如何为自定义 BAT 文件创建 HELP 命令?【英文标题】:How do I create HELP command for custom BAT files? 【发布时间】:2022-01-16 02:47:18 【问题描述】:我已经编写了将文本转换为uppercase
的小脚本,如下所示,并将此文件保存为.BAT
扩展名
`converttoupper.bat`
我希望用户尝试“帮助”命令,以便他们获得有关使用以下命令的语法的帮助
help converttoupper
类似的东西
# help converttoupper
For more information on a specific command, type HELP command-name
CONVERTTOUPPER This converts the text to upper case
更新
即使我得到如下所示的东西,我也很好。我不想覆盖任何 windows 命令。
helpme converttoupper
or
helpme connect***
我有很多 BAT 文件,希望在每个执行时显示各自的帮助。
【问题讨论】:
您已经知道参数存储在%1
/%2
/等中。你知道if
语句是什么。你卡在哪一点?这两件事应该是你需要知道的。
help
是一个 Windows 命令 ('C:\Windows\System32\help.exe). You'd have to hack this program to include the help for your batch file. Besides that Windows has a safeguard to protect it from changed executables, you'd have to do that on every computer that is meant to run your batchfile. I'm sure that's not the way you want to go. Use the standard way instead:
converttoupper.bat /?` (你已经证明你知道如何处理参数,所以这个应该是微不足道的)
【参考方案1】:
您可以创建“假”功能。让我们称它为define.cmd
并将其放入%systemroot%\system32
我们添加代码:
@echo off
for /f "tokens=1,*delims=? " %%i in ('type "%~1" ^|findstr ":?"') do echo %%j
然后在您希望人们阅读帮助的所有批处理文件中,添加帮助行,以 :?
开头,使用您的 convertoupper.cmd
文件作为示例:
@echo off & set upper=
if "%~1" == "" echo incorrect usage & call define.cmd "%0"
if "%~1" == "/?" call define.cmd "%0"
for /f "skip=2 delims=" %%I in ('tree "\%~1"') do if not defined upper set "upper=%%~I"
set "upper=%upper:~3%"
echo %upper%
goto :eof
:? # help converttoupper
:? "define %0" or "%0 /?" will display this help content
:? For more information on a specific command, type HELP command-name
:? CONVERTTOUPPER This converts the text to upper case
现在您可以运行define converttoupper
或converttoupper /?
。如果您不带任何参数运行converttoupper
,它也会显示相同的帮助。
【讨论】:
我遇到以下错误 - 错误使用“define.cmd”未被识别为内部或外部命令、可运行程序或批处理文件。 是的,将其另存为helpme
。如果您不想使用 System32,可以将它放在其他任何位置,然后只需在 %path%
中定义该路径
如果你用:?
标准化你的批处理文件并且路径中有helpme
,它会的。
没关系。答案已在关闭前发布。
那些,只需删除第一行if "%~1" == "" echo incorrect usage & call define.cmd "%0"
【参考方案2】:
以下是安全处理 arg 捕获和帮助查询的示例。
参数被安全捕获后,Findstr 用于测试内容是否有效帮助开关:
Set Args | %SystemRoot%\System32\Findstr.exe /bli "Args=\/? Args=-? Args=Help?" > nul && (Rem commands)
Set Args
:允许将参数字符串通过管道传输到 findstr ,而不会因有毒字符而导致失败。
/bli
: findstr sawitches : 在行首匹配文字字符串,忽略大小写。
"Args=\/? Args=-? Args=Help?"
:要匹配的空格分隔的字符串列表;视为匹配字符串 a 或 b 或 c
> nul
: 抑制任何匹配的输出
&&
:条件运算符; '命令成功'
注意:用?
终止每个帮助开关允许使用子字符串修改来删除前导开关和空格,并直接调用以查询关键字为前缀的标签
@Echo off & SETLOCAL
=========================================================================
Rem -- Arg capture method is a modified version of Dave Benhams method:
Rem -- https://www.dostips.com/forum/viewtopic.php?t=4288#p23980
SETLOCAL EnableDelayedExpansion
1>"%~f0:Params.dat" <"%~f0:Params.dat" (
SETLOCAL DisableExtensions
Set prompt=#
Echo on
For %%a in (%%a) do rem . %*.
Echo off
ENDLOCAL
Set /p "Args="
Set /p "Args="
Set "Args=!Args:~7,-2!"
@Rem duplicate Args for the purpose of counting doublequotes [destructive].
Set "DQcount=!Args!"
) || (
Echo(%~nx0 requires an NTFS drive system to function as intended.
CMD /C Exit -1073741510
) || Goto:Eof
If Not defined Args Goto:NoArgs
REM substitute doublequotes in Args clone 'DQcount'; count substring in string;
REM assess if count is even; If false "||": Remove doublequotes from string. If true "&&" and if entire
REM arg line is doublequoted, remove outer quotes.
Set Div="is=#", "1/(is<<9)"
Set "DQ=0"
Set ^"DQcount=!DQcount:"=DQ!"
2> nul Set "null=%DQcount:DQ=" & Set /A DQ+=1& set "null=%"
Set /A !Div:#=DQ %% 2! 2> nul && Set ^"Args=!Args:"=!" || If [^%Args:~0,1%^%Args:~-1%] == [""] Set "Args=!Args:~1,-1!")
For /f Delims^= %%G in ("!Args!")Do Endlocal & Set "Args=%%G" 2> nul
:NoArgs
=====================================================================
Rem help query assessment
(
Set Args | %SystemRoot%\System32\Findstr.exe /bli "Args=\/? Args=-? Args=Help?" > nul && (
Rem Args value has leading /? -? or help?
If not "%Args:*?=%"=="" (
Rem Args value contains leading /? -? or help? with additional Parameter
Call:%Args:*? =%_Syntax && Goto:Eof || (
Rem quit after Call to Syntax info if valid Parameter; else notify invalid and show valid syntax queries.
Echo(Invalid query: "%Args:*? =%" : Does not Match a valid Help Query:
)
)
Rem show valid syntax queries.
For /F "Tokens=1 Delims=:_" %%G in ('%SystemRoot%\System32\Findstr.exe /R "^:.*_Syntax" "%~f0"') Do Echo(%~nx0 /? %%G
ENDLOCAL & Exit /b 0
)
) 2> nul
Set Args
Goto:Eof
Rem Demo syntax labels
:Demo_Syntax
Echo %~0 help info
Exit /b 0
:Example_Syntax
Echo %~0 help info
Exit /b 0
【讨论】:
以上是关于如何为自定义 BAT 文件创建 HELP 命令?的主要内容,如果未能解决你的问题,请参考以下文章