批处理程序无故退出而没有错误

时间:2018-07-02 11:25:20

标签: batch-file compiler-construction

我正在为我的其他程序“ Super Command Promt”制作一个批处理程序(在pastebin上查看它的确非常好!),我注意到为其制作插件有点棘手,所以我决定开始在A上工作简单的编译器使其更易于制作插件,但是我似乎无法使其正常工作!我打开文件类型命令:

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: liamhmccracken@gmail.com (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!

2 个答案:

答案 0 :(得分:1)

确保打开回显后出现的错误消息是:

echo was unexpected at this time.

这并不完全具有启发性,但是它确实暗示了语法错误(尽管与echo无关(可能与它之前的内容有关))。

封装字符串变量

我看到的基本问题是,您正在使用可能为空的变量进行字符串比较,而没有将它们括在引号中。这将成为语法错误,因为cmd随后会运行类似

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

cmd 关于变量不是很聪明。在引用变量的任何地方都可以进行直接替换。

构造非易碎性的典型方法(当应用于与cmd有关的任何事情时, robust 都是夸大其词)是将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 :(得分:1)

我发现由于某种原因,我的特定程序嵌套在for循环中有点笨拙,它们会随机出现而实际上并没有起作用,所以我创建了一个函数并将第二个for循环放在那里,只是首先调用函数,然后完美运行!