调用另一个批处理文件并传递参数

21

我有一个批处理文件,运行时会询问用户输入。这个工作正常。

@REM Sample batch file
SET PARAM1=""
SET PARAM2=""
SET /P PARAM1=Enter param1: %=%
SET /P PARAM2=Enter param2: %=%
@REM Process the params

我想现在能够从另一个批处理文件中调用此批处理文件并将参数值传递给它,而且用户不需要输入。我如何实现这一点?

3个回答

24

我认为你想要的是这样的效果?

@echo off

:: Fetch param1
set "param1=%~1"
goto :param1Check
:param1Prompt
set /p "param1=Enter parameter 1: "
:param1Check
if "%param1%"=="" goto :param1Prompt

:: Fetch param2    
set "param2=%~2"
goto :param2Check
:param2Prompt
set /p "param2=Enter parameter 2: "
:param2Check
if "%param2%"=="" goto :param2Prompt

:: Process the params
echo param1=%param1%
echo param2=%param2%

无参数运行 Test.bat:

>>test.bat
Enter parameter 1: foo
Enter parameter 2: bar
param1=foo
param2=bar

Test.bat 带参数运行:

>>test.bat foo bar
param1=foo
param2=bar

另一种方法是使用环境变量而不是命令行参数(也可以参见ppumkin的答案):

@echo off  

:: Fetch param1  
**set "param1=%globalparam1%"**  
goto :param1Check  
:param1Prompt  
set /p "param1=Enter parameter 1: "  
:param1Check  
if "%param1%"=="" goto :param1Prompt  

:: Fetch param2    
**set "param2=%globalparam2%"**  
goto :param2Check  
:param2Prompt  
set /p "param2=Enter parameter 2: "  
:param2Check  
if "%param2%"=="" goto :param2Prompt  

:: Process the params  
echo param1=%param1%  
echo param2=%param2%

只需在您的环境变量或调用批处理文件中设置globalparam1globalparam2环境变量即可抑制提示:

未设置环境变量运行Test.bat:

>>test.bat
Enter parameter 1: foo
Enter parameter 2: bar
param1=foo
param2=bar

使用设置的环境变量运行Test.bat:

>>set globalparam1=foo

>>set globalparam2=bar

>>test
param1=foo
param2=bar

注意:设置环境变量也可以在调用批处理脚本中完成。


这很好 - 但问题是如何在另一个批处理中从<code>set</code>设置全局变量,以便如果他运行完全不同的批处理,可以根据示例代码从全局环境中获取它们。不是吗? - Piotr Kula
以上是我对问题的回答,根据我对OP想要什么的理解,考虑到问题的表述和其他答案的评论...批处理文件“可以单独调用,在其中[I]被要求提供参数”,同时保持能够“从另一个批处理文件中调用此批处理文件并将参数值传递给上述批处理文件,用户不会被要求输入”。 - mousio
1
@ppumkin:你可以从另一个批处理文件中调用我的批处理文件,并在“call”行上传递参数。你的方法似乎是从另一个批处理文件中调用批处理文件,并通过设置环境变量来传递参数。这也是一种有效的方法,我的方法只是我喜欢使用和提出的另一种选择。 - mousio
好的,最后一段代码正在做这件事。调用在另一个批处理文件中设置的环境变量。好吧,我没有想到一种接受传递变量的方法...但这不是问题的范围...那么为什么我的答案被删除了呢? - Piotr Kula
@ppumkin:如果你想知道,可以问一下楼主,除了发布自己的答案外,我没有做任何事情:] - mousio
显示剩余2条评论

12

main.cmd 中:

set param1=%~1
set param2=%~2
echo %param1% - %param2%

caller.cmd 文件中:

call main.cmd hello world

输出:

hello - world

批处理参数参考


但是我也想能够单独调用main.bat文件,并在其中询问参数,这是否可能? - amateur
在编程中,“asked”是什么意思?比如在批处理中,它会询问你想要传递给自身的参数是什么? - Piotr Kula
好的 - 所以你想从另一个批处理文件中调用这个询问问题的批处理文件,然后第二个批处理文件必须将变量传回到已经运行的批处理文件中.. 很抱歉,我可能没有完全理解这个问题。 - Piotr Kula

4

caller.bat /.cmd

@echo off
cls
set vara="Hello There"
set varb=67890

echo Variables set in caller.bat:
echo %vara%
echo %varb%

echo Calling passTo.bat
call passTo.bat %vara% %varb%

passTo.bat /.cmd

@echo off
echo.
echo Inside passTo.bat
set vara=%1
set varb=%2

echo vara: %vara%
echo varb: %varb%

从命令行或其他应用程序/快捷方式中调用 passTo.bat

call passTo.bat PARAM1 PARAM2

在另一个批处理文件中使用caller.bat设置的变量
@echo off
echo.
echo Inside another.bat
echo -- You can start another batch here that sets the environment variables

set varOne=%vara% <- This gets the Environments Variable set in the nested batch bat using SET
set varTwo=%varb%

echo vara: %varOne% 
echo Is the same as
echo %vara%

echo varb: %varTwo%
echo is again the same as
echo %varb$

您可能需要使用SETX命令


但是我想能够单独调用 passTo.bat 文件,在其中被要求输入参数,这是否可能? - amateur
像这样 - 调用由另一个批处理设置的环境变量? - Piotr Kula
应该写成 echo %varb% 而不是 eacho %varb$,请问您是否需要进一步的帮助? - George Birbilis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接