Пакетная программа завершает работу без причины без ошибок - PullRequest
0 голосов
/ 02 июля 2018

Я делаю пакетную программу для моей другой программы «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 голосов
/ 05 июля 2018

Я понял, что по какой-то причине моя конкретная программа, вложенная в циклы, была немного глючной, где они просто вели себя случайным образом и не работали на самом деле, поэтому я создал функцию и поместил там свой второй цикл, и просто Сначала вызови функцию, затем она сработала идеально!

0 голосов
/ 02 июля 2018

Сообщение об ошибке, которое я вижу, убедившись, что эхо включено:

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 завершит работу сценария без завершения процесса оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...