在Windows命令提示符中,是否可以像Unix一样源批处理文件?

22

我是个Unix专家,但我现在需要在Windows上编写一个系统,并尝试编写一个脚本来移动一些文件。我正在尝试让父批处理文件调用一个包含以下内容的子批处理文件:

set REPORTFILE=c:\report.txt

然后,我希望父文件能够使用%REPORTFILE%变量。显然,CALL命令会创建一个新的上下文。 在Unix中,你只需要源化脚本,那在Windows中是否也可能呢?


1
现在我在思考能否做一些类似于Unix的技巧,如将 REPORTFILE='cat filewithname.txt'。(假装这是反引号)。在Windows中是否有相当的方法? - stu
啊啊啊...就是这个吗?set /p REPORTFILE= < tmpFile - stu
1
CALL 不会创建新的上下文,除非被调用的脚本/例程发出 SETLOCAL 命令。您应该展示一个完整的示例(主程序和子程序),以便确定问题所在。我怀疑您可能正在调用并设置括号内的值,这将需要延迟扩展。 - dbenham
1个回答

24

如果我理解得没错...在Vista系统下,以下内容对我有效:

caller.bat

echo this is the caller
echo initial value is: %reportfile%
call setter.bat
echo value is: %reportfile%

setter.bat

echo this is the value setter
set reportfile=c:\report.txt

C:\temp>caller

C:\temp>echo 这是调用者
this is the caller
C:\temp>echo 初始值为:
initial value is:
C:\temp>call setter.bat

C:\temp>echo 这是值设置器
this is the value setter
C:\temp>set reportfile=c:\report.txt

C:\temp>echo 值为: c:\report.txt
value is: c:\report.txt

使用goto替代括号更新:

if not exist file.txt goto doit
goto notfound
:doit 
echo this is the caller 
echo initial value is: %reportfile% 
call setter.bat
echo value is: %reportfile%
goto end
:notfound
 echo file found 
:end

是的,在XP系统中这对我不起作用。如果你运行那个脚本,然后执行set reportfile命令,你会得到什么?我发现该变量在我的调用上下文中被设置,但在脚本中没有被设置。 - stu
请为我设置报告文件路径:reportfile=c:\report.txt - Stanley
我看到你的案例可以运行,我的有点更复杂,我在你的基础上添加了括号然后开始失败了,把你的caller.bat改成这样:if not exist file.txt ( echo this is the caller echo initial value is: %reportfile% call setter.bat echo value is: %reportfile% ) else ( echo file found ) - stu
我认为问题在于括号()... 我将其删除并使用了goto,以及:标签,然后它就可以工作了...上面添加了一些内容,以便代码更易读。 - Stanley
是的,我也做了同样的事情,并以这种方式使其工作,但是括号是否应该创建新的上下文,它似乎只做了一半。毫无意义。Windows 需要更多的 Unix。 - stu

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