我面临一个奇怪的问题 我有一个批处理文件说batch1.bat 在这个批处理文件中,我调用perl脚本说perl1.pl 然后在这个perl1.pl中,我调用另一个批处理文件说batch2.bat
现在我从locatoin调用batch1.bat说:F:\ mydir \ tests \ scripts 然后它最终调用batch2.bat,在batch2完成时,我使用cd将目录更改为F:\ mydir \ tests。 DOS窗口显示它改变了目录,但是当我发出命令" dir"它给出了F:\ mydir \ tests \ scripts中的文件列表,而不是F:\ mydir \ tests中的文件列表 是什么原因?谢谢你的帮助。
答案 0 :(得分:1)
编写.bat文件时,echo %~dp0
用于引用.bat文件所在的目录。
例如:
@echo off
call %~dp0\example.bat
将调用名为example.bat的文件,该文件与您最初运行的.bat文件位于同一目录中。
要了解这段代码的真正含义,您可以在.bat文件中运行以下代码:
@echo off
echo %~dp0
@pause
对我来说,控制台中打印的结果是:C:\ Users \ Brad \ Desktop。
希望这能够帮助您实现目标。祝你好运!
答案 1 :(得分:0)
当您从另一个程序(在本例中为perl.exe
)内部调用批处理文件时,它会创建一个全新的cmd.exe
实例来运行新的批处理文件。您可以在该新实例中设置变量,更改目录等,但它对原始实例没有影响。当新的cmd.exe退出时,任何更改都将丢失,您将继续在旧实例中运行。
请注意,如果直接从batch1调用batch2,则不会发生这种情况,因为它们使用相同的cmd.exe实例。问题是另一个程序介于两者之间。
如果您需要batch1来更改目录,那么一旦batch2完成,batch1需要cd
。
答案 2 :(得分:-1)
要清楚。这是你的计划吗?
<强> F:\ MYDIR \测试\脚本\ batch1.bat 强>:
perl perl1.pl
<强> perl1.pl 强>:
-> batch2.bat
<强> batch2.bat 强>:
cd F:\mydir\tests
dir
在上面的方案中,最后一个dir
命令肯定会显示F:\ mydir \ tests的内容。但是,如果batch2.bat
在开始时有一个setlocal
命令,而在endlocal
命令之前有一个dir
,那么此时{{1}当执行endlocal
命令时,当前目录被更改回当前目录:
<强> batch2.bat 强>:
setlocal
这是setlocal / endlocal命令的未记录行为。请注意,如果批处理文件具有setlocal
cd F:\mydir\tests
endlocal
dir
命令,则会发生相同的行为,更改当前目录然后终止,因为批处理文件末尾有隐式setlocal
。