更改目录会使%~dp0停止工作

时间:2012-04-05 13:35:32

标签: windows batch-file command prompt

我在C:\驱动器上有两个批处理文件,并使用%~dp0命令使用第一个脚本的路径来复制第二个批处理脚本:

COPY %~dp0"Hello World.BAT" C:\"Hello World.bak"

在脚本的早期,我需要更改为C:\根目录下的子目录,但这会阻止上面的复制命令使我得到的错误是“无法找到文件”。如果我留在C:\的根目录中,复制命令可以正常工作。任何想法为什么会这样。

2 个答案:

答案 0 :(得分:5)

解决此问题的另一种方法是将%~dp0保存在脚本开头的另一个变量中。

@echo off
setlocal
set filepath=%~dp0
.
.
some code
.
.
cd away from original path
.
.
COPY "%filepath%Hello World.BAT" "C:\Hello World.bak"

应该工作。

我很想到它不起作用的原因与你的报价有关。

你有这个:

COPY %~dp0"Hello World.BAT" C:\"Hello World.bak"

替换为:

COPY "%~dp0Hello World.BAT" "C:\Hello World.bak"

您需要将整个路径包装在引号中以确保它能够正常工作。如果你有:

C:\Program Files\Somefolder\

作为你的路径,并使用引号如何拥有它们,结果如下:

"C:\Program Files\Somefolder\""Hello World.bak"

它不起作用。

答案 1 :(得分:2)

我并没有完全理解当前目录如何更改当前目录会导致命令在更改之前失效。但我注意到引号并未达到最佳状态。路径中的空格会导致命令失败,但在我看来,无论您当前的目录如何,它都会失败。

我会用:

COPY "%~dp0Hello World.BAT" "C:\Hello World.bak"

将引用移到第一个参数的前面可能很重要。将它移动到第二个参数并不重要,因为路径中显然没有空格,但它看起来更好。

修改
在仔细阅读你的问题之后,我认为故事必须有更多。如果两个批处理文件都在C驱动器的根目录中,那么原始发布的代码应该可以正常工作。

尝试编辑脚本以诊断正在发生的事情。在复制命令之前放置ECHO,以便您可以看到脚本尝试执行的操作。 (或者只是确保回声打开,但是在输出中找到正确的行可能更难。)

echo COPY %~dp0"Hello World.BAT" C:\"Hello World.bak"

如果您仍然无法弄清楚出了什么问题,请发布结果,以便其他人可以提供帮助。