如何为自定义 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 converttoupperconverttoupper /?。如果您不带任何参数运行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 命令?的主要内容,如果未能解决你的问题,请参考以下文章

求助如何用bat整理文件内容,并输出结果?

如何为apache提供cmd权限?

如何为 Qt 创建自定义小部件

如何为以下示例创建自定义格式、公式或 VBA 代码?

如何为 QtCreator 创建自定义主题

如何为bat文件产生log文件?