Windows批处理粘贴到运行批处理文件的目录

时间:2015-05-19 17:50:29

标签: windows batch-file cmd

我面临一个奇怪的问题 我有一个批处理文件说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中的文件列表 是什么原因?谢谢你的帮助。

3 个答案:

答案 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