批处理一个脚本但不是另一个脚本的条件编译错误

时间:2018-01-11 03:08:23

标签: batch-file jscript

语言:批量+一点JScript。

主要想法: JScript适用于一个程序,但不适用于另一个程序。

错误消息: Microsoft JScript编译错误:关闭了条件编译。

我的问题是我试图从我的pastebin中获取一些信息到批处理变量中。我希望我的代码检查并执行网站上的代码。我已经让代码独立工作,但是当我将它添加到主程序时,我得到Microsoft JScript compilation error: Conditional compilation is turned off错误。如果我自己运行相同的脚本,它可以很好地工作,但是当我将它添加到主脚本时它会中断。

我很确定我添加的彩色文本脚本打破了它,但我不是100%肯定。 基本上,为什么网站数据代码本身可以工作,而不是其他任何东西。

我该如何解决这个问题?

[不工作] 菜单+彩色文字+网站信息

@echo off
color 0a
setlocal
call :initColorPrint
call :title

rem ---- Menu Stuff ----

:menu
call :title
echo.
echo (Type 'version' to see error)
echo.
call :colorPrint 09 "%time%"
call :colorPrint 06 "@"
call :colorPrint 0c "%username%"
set /p call=^> 
if "%call%" =="version" goto :version
%call%
goto menu

:title
title CMD ^| User: %username%
exit /b

rem ---- This part doesn't work... ----

:version
@if (@a==@b) @end /*
@echo off
setlocal
call :stuff
timeout 1 
echo.
echo %code%
set "code=%code%"
timeout 3
exit

:stuff
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "https://pastebin.com/raw/wAtBQEeZ"') do (
set "code=%%I"
echo(%%I
)
exit /b

JScript */
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET",WSH.Arguments(0),true);
x.setRequestHeader('User-Agent','XMLHTTP/1.0');
x.send('');
while (x.readyState!=4) {WSH.Sleep(50)};
WSH.Echo(x.responseText);

rem ----- Color Stuff -----

:colorPrint Color  Str  [/n]
setlocal
set "str=%~2"
call :colorPrintVar %1 str %3
exit /b

:colorPrintVar  Color  StrVar  [/n]
if not defined %~2 exit /b 
setlocal enableDelayedExpansion
set "str=a%DEL%!%~2:\=a%DEL%\..\%DEL%%DEL%%DEL%!"
set "str=!str:/=a%DEL%/..\%DEL%%DEL%%DEL%!"
set "str=!str:"=\"!"
pushd "%temp%"
findstr /p /A:%1 "." "!str!\..\x" nul
if /i "%~3"=="/n" echo(
exit /b

:initColorPrint
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do set "DEL=%%a"
<nul >"%temp%\x" set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%.%DEL%"
exit /b

:cleanupColorPrint
del "%temp%\x"
exit /b

图片:

Not Working Error

[工作] 网站信息代码

@if (@a==@b) @end /*
@echo off
setlocal
call :stuff
timeout 1 
echo.
echo %code%
set "code=%code%"
timeout 3
exit

:stuff
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "https://pastebin.com/raw/wAtBQEeZ"') do (
set "code=%%I"
echo(%%I
)
exit /b

JScript */
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET",WSH.Arguments(0),true);
x.setRequestHeader('User-Agent','XMLHTTP/1.0');
x.send('');
while (x.readyState!=4) {WSH.Sleep(50)};
WSH.Echo(x.responseText);

工作图片:

Working Script

1 个答案:

答案 0 :(得分:2)

您正在尝试编写一个混合脚本,该脚本是cmd.exe批处理,另一部分是JScript(通过CSCRIPT执行)

您必须确保批处理永远不会尝试执行JScr​​ipt代码,相反,JSCRIPT绝不能尝试执行批处理代码。

很容易防止批量通过EXIT / B看到JScript(和/或可能带有:标签的GOTO / CALL)。但是CSCRIPT引擎总是会尝试将整个脚本解析为JSCRIPT。

成功的混合脚本的诀窍是在一开始就有一个有效批处理和JScript的行。第一行不应该在批处理中执行任何操作,在JScript中,除了开始JScript多行注释之外,它什么都不做。所有批处理代码如下,然后以EXIT / B结束。然后,您有一行关闭JScript多行注释,然后是JScript代码。

您似乎试图将正在运行的混合脚本粘贴到另一个脚本中,而不了解其工作原理。您只需重新构建代码,以确保所有批处理代码都隐藏在JScript中(作为注释的一部分)

@if (@a==@b) @end /* This is a harmless hybrid batch/JScript line that begins a JScript comment.

@rem ================== Batch code ==========================
@echo off
color 0a
setlocal
call :initColorPrint
call :title

rem ---- Menu Stuff ----

:menu
call :title
echo.
echo (Type 'version' to see error)
echo.
call :colorPrint 09 "%time%"
call :colorPrint 06 "@"
call :colorPrint 0c "%username%"
set /p call=^>
if "%call%" =="version" goto :version
%call%
goto menu

:title
title CMD ^| User: %username%
exit /b

:version
@echo off
setlocal
call :stuff
timeout 1 
echo.
echo %code%
set "code=%code%"
timeout 3
exit

:stuff
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "https://pastebin.com/raw/wAtBQEeZ"') do (
set "code=%%I"
echo(%%I
)
exit /b

rem ----- Color Stuff -----

:colorPrint Color  Str  [/n]
setlocal
set "str=%~2"
call :colorPrintVar %1 str %3
exit /b

:colorPrintVar  Color  StrVar  [/n]
if not defined %~2 exit /b
setlocal enableDelayedExpansion
set "str=a%DEL%!%~2:\=a%DEL%\..\%DEL%%DEL%%DEL%!"
set "str=!str:/=a%DEL%/..\%DEL%%DEL%%DEL%!"
set "str=!str:"=\"!"
pushd "%temp%"
findstr /p /A:%1 "." "!str!\..\x" nul
if /i "%~3"=="/n" echo(
exit /b

:initColorPrint
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do set "DEL=%%a"
<nul >"%temp%\x" set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%.%DEL%"
exit /b

:cleanupColorPrint
del "%temp%\x"
exit /b

====================== JScript Code ======================== */
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET",WSH.Arguments(0),true);
x.setRequestHeader('User-Agent','XMLHTTP/1.0');
x.send('');
while (x.readyState!=4) {WSH.Sleep(50)};
WSH.Echo(x.responseText);

我没有在代码中查找其他问题。它可能会也可能不会起作用。但这应解决JScript编译错误。