批处理程序无故退出且无错误

问题描述 投票:0回答:2

我正在为我的另一个程序“Super Command Promt”制作一个批处理程序(在pastebin上查看它真的很棒!)并且我注意到为它制作插件有点棘手,所以我决定开始开发一个简单的编译器为了更容易地制作插件,但我似乎无法让它工作!我打开文件类型命令:

compile test.txt test.scmd

但是它不起作用它只是退出而没有错误,而不是制作文件并返回到提示屏幕

Heres the Script:

REM Made By LiamBogur
REM To install copy into notepad and press save as select all files and save it as "SCMDCOMPILER.bat"
REM Feel free to message me or email me at: [email protected] (I dont check my email much so try messaging me first)
cls
@echo off
set Version=1.0.0
title Super Command Prompt Plugin Compiler
echo Super Command Prompt Plugin Compiler [Version %Version%]
echo.
:A
set CommandA=
set Command=
set CommandB=
set CommandC=
set /p CommandA=^>
for /f "tokens=1" %%i in ("%CommandA%") do set Command=%%i
for /f "tokens=2" %%i in ("%CommandA%") do set CommandB=%%i
for /f "tokens=3" %%i in ("%CommandA%") do set CommandC=%%i
if /I %Command%==HELP echo Compiler ^| HELP                                   Displays This Message
if /I %Command%==HELP echo Compiler ^| COMPILE [inputfile] [outputfile]       Compiles The Input File Into SCMD Format (eg. input.txt output.scmd)
if /I %Command%==HELP echo Compiler ^| EXIT                                   Exits The Compiler
if /I %Command%==HELP echo Commands ^| COMMAND [command] [commands]           Makes The Command "command" And Makes It Run "commands"
if /I %Command%==HELP echo Commands ^| RUN [commands]                         Run Some Commands In Batch 
if /I %Command%==HELP echo Commands ^| COMMENT [comment]                      Adds A Comment To Your File
if /I %Command%==HELP echo Commands ^| HELP [message]                         Adds That Message To PHELP (eg."HELP Restart    Restarts The Computer")
if /I %Command%==EXIT exit
if /I %Command%==COMPILE goto B
goto A
:B
echo Decoding %CommandB%.
for /f "delims=*" %%i in (%CommandB%) do (
set WordN=0
for /f "tokens=*" %%u in ("%%i") do (
set /A WordN+=1
if %WordN%==1 (
set CCommand=0
if /I %%u==COMMAND (
set CCommand=1
set LineO=if ^%A^%==2 if /I ^%Command^%==
)
if /I %%u==RUN (
set CCommand=2
set LineO=call
)
if /I %%u==COMMENT (
set CCommand=3
set LineO=rem
)
if /I %%u==HELP (
set CCommand=4
set LineO=if ^%A^%==2 if /I ^%Command^%==PHELP echo %CommandC:~0,-5% ^^^|
)
) else (
if CCommand==1 (
set LineO=%LineO%%%u
) else (
set LineO=%LineO% %%u
)
)
echo %LineO%>>C:\Users\Public\Temp.txt
)
mv C:\Users\Public\Temp.txt %CommandC%
goto A

我真的需要这方面的帮助!

编辑1: 这是 test.txt 的代码:

COMMENT Lol this is cool
COMMAND test Lol 123 456
HELP Oh No!

这就是编译后的含义

REM Lol this is cool
if %A%==2 if /I %Command%==test Lol 123 456
if %A%==2 if /I %Command%==PHELP echo TEST ^| Oh No!
batch-file compiler-construction
2个回答
1
投票

确保 echo 打开后看到的错误消息是:

echo was unexpected at this time.

这并不完全具有启发性,但它确实表明存在语法错误(尽管没有使用 echo - 可能与它之前的内容有关)。

封装字符串变量

我看到您正在做的事情的根本问题是您正在与可能为空的变量进行字符串比较,并且您没有将它们括在引号内。这变成了一个语法错误,因为 cmd 运行的命令看起来像

if /I ==HELP echo Commands ^| HELP [message]

cmd 对于变量来说并不聪明。它在引用变量的地方进行简单的替换。

构建非脆弱性(健壮在应用于有关 cmd 的任何内容时是一种夸大其词)的典型方法是将 LHS 和 RHS 值括在引号内,以便空值导致语法上合法的语句。

if /I "%Command%"=="HELP" echo Commands ^| HELP [message]

这样,当替换发生时(对于输入的最后一行),其中

Command
为空,执行的命令如下所示

if /I ""=="HELP" echo Commands ^| HELP [message]

这在语法上是合法的。

使用 /B 退出

您可能想要使用

EXIT /B
而不仅仅是
EXIT
,因为
EXIT
本身将结束调用 cmd 进程,在测试中,该进程通常是您的 cmd 窗口。大多数人不希望这种情况发生。
EXIT /B
将结束脚本而不结束 shell 进程。


1
投票

我发现由于某种原因,对于我的特定程序,嵌套 for 循环有点错误。它们只是随机行为,并没有真正起作用,所以我创建了一个函数,将第二个 for 循环放在那里,然后让第一个循环调用该函数。然后,就完美运行了!

© www.soinside.com 2019 - 2024. All rights reserved.