2017-11-25 420 views
1

我正在编写一个批处理文件,它需要一些更多的文件。但是他们的文件应该只能使用另一个批处理文件中的调用函数运行。我的代码如下所示:如何从批处理文件中调用批处理文件?

call compileData.bat 
pause 

我想compilerData.bat刚开始时它是从这个叫,如果没有它只是从资源管理器或其他的东西开始。

你能帮我吗?

我试图在一个小时内就此问题找到解决方案!

+0

为什么你想compileData.bat只能从你的脚本运行?是否依赖于环境变量,如果没有脚本,可能无法正确设置? – jwdonahue

回答

1

您可以使用参数。

compileData.bat:

if "%1" neq "somestring" exit /b 
REM rest of your code 

Another.bat:

call compileData.bat somestring 
pause 
0

我想不出任何办法将阻止调用的脚本的裸 “运行”。可能这只能使用NTFS权限来完成。

可以迅速做的是这样的:

MOTHERBATCH.bat

call compileData.bat SomePASSPHRASE 

compileData.bat

@echo off 
if not "%1"=="SomePASSPHRASE" (
echo "You can not run this script directly, please run MOTHERSCRIPT.bat." 
exit /B 1 
) 

echo "Passphrase is correct, code is executed..." 
-1

坐落在父脚本的环境变量,然后如果这变量没有设置,或者在孩子中没有正确的值,他们只是退出并显示一条错误消息,说明他们不适合独立使用。你确实无法阻止某人对代码进行反向工程并迫使其运行。

你可以把孩子放在一个受密码保护的zip文件中,让父母在打电话前解开它。然后,当父项完成时,它将删除解压后的脚本。

完成以上所有操作。

+0

为什么选择投票? – jwdonahue

0

您可以使用不太知名的系统变量cmdcmdline

我会为你解释一个简短的用法。

为简洁起见,我们将有两个非常简单的批处理文件。

Parent.bat

@echo off 
call compiledata.bat 

而且compiledata.bat

@echo off 
echo %cmdcmdline% 
pause 

compiledata.bat是在自己的这个变量的值执行是批处理文件本身。

C:\WINDOWS\system32\cmd.exe /c ""C:\Batch\CALL\compiledata.bat" " 

但当compiledata.batparent.bat称为变量的值是主叫parent.bat的。

C:\WINDOWS\system32\cmd.exe /c ""C:\Batch\CALL\parent.bat" " 
+0

这就是我所记得的,但在这两种情况下,我的Win10都给了我''C:\ WINDOWS \ system32 \ cmd.exe“。 (当我从命令提示符启动它们时) – Stephan

+0

@Squashman,看起来你的解决方案只有在脚本从资源管理器启动时才有效。它不能在Win10上从命令行运行。 – jwdonahue

0

我的建议是将所有的批处理代码放入一个批处理文件并使用子程序。打开命令提示符窗口并运行call /?以获取有关如何使用子例程的帮助,这些子例程无非是调用当前批处理文件中嵌入的批处理文件。

一个简单的例子:

@echo off 
echo Running %~f0 %* 
call :compileData %* 
call :WaitForUser 
rem The next line results in exiting processing of this batch file 
goto :EOF 

:compileData 
echo/ 
echo Running subroutine compileData with the arguments: %* 
rem Exit processing subroutine compileData and continue above 
rem after the command line calling the subroutine compileData. 
goto :EOF 

:WaitForUser 
echo/ 
pause 
rem Exit processing subroutine WaitForUser and continue above 
rem after the command line calling the subroutine WaitForUser. 
goto :EOF 

又见Where does GOTO :EOF return to?并采取DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/看看在解释使用echo/输出一个空行。