Windows 更改目录会停止%dp0的工作

Windows 更改目录会停止%dp0的工作,windows,batch-file,command,prompt,Windows,Batch File,Command,Prompt,我在C:\驱动器上有两个批处理文件,正在使用%~dp0命令使用第一个脚本的路径复制第二个批处理脚本: COPY %~dp0"Hello World.BAT" C:\"Hello World.bak" 在脚本的早期,我被要求更改为C:\根目录下的子目录,但这会阻止上面的复制命令工作。我得到的错误是“找不到文件”。如果我停留在C:\的根目录中,copy命令就可以完美地工作。知道为什么会发生这种情况吗。我还没有完全弄清楚在更改之前更改当前目录是如何导致命令失败的。但我注意到引号的位置并不是最优的。路

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

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

在脚本的早期,我被要求更改为
C:\
根目录下的子目录,但这会阻止上面的复制命令工作。我得到的错误是“找不到文件”。如果我停留在
C:\
的根目录中,copy命令就可以完美地工作。知道为什么会发生这种情况吗。

我还没有完全弄清楚在更改之前更改当前目录是如何导致命令失败的。但我注意到引号的位置并不是最优的。路径中的空格将导致命令失败,尽管在我看来,不管您当前的目录如何,它都应该失败

我将使用:

COPY "%~dp0Hello World.BAT" "C:\Hello World.bak"
将引号移到第一个参数的前面可能很重要。将其移动到第二个参数并不重要,因为路径中显然没有空格,但对我来说它看起来更好

编辑
在更仔细地阅读了你的问题之后,我想故事一定还有更多的内容。如果两个批处理文件都在C驱动器的根目录中,那么您原来发布的代码应该可以工作

尝试编辑脚本以诊断正在发生的事情。将ECHO放在copy命令之前,以便查看脚本正在尝试执行的操作。(或者只需确保echo处于打开状态,但在输出中可能更难找到正确的行。)


如果您仍然无法找出错误所在,请发布结果,以便其他人可以提供帮助。

我还没有确切了解在更改之前更改当前目录如何导致命令失败。但我注意到引号的位置并不是最优的。路径中的空格将导致命令失败,尽管在我看来,不管您当前的目录如何,它都应该失败

我将使用:

COPY "%~dp0Hello World.BAT" "C:\Hello World.bak"
将引号移到第一个参数的前面可能很重要。将其移动到第二个参数并不重要,因为路径中显然没有空格,但对我来说它看起来更好

编辑
在更仔细地阅读了你的问题之后,我想故事一定还有更多的内容。如果两个批处理文件都在C驱动器的根目录中,那么您原来发布的代码应该可以工作

尝试编辑脚本以诊断正在发生的事情。将ECHO放在copy命令之前,以便查看脚本正在尝试执行的操作。(或者只需确保echo处于打开状态,但在输出中可能更难找到正确的行。)


如果您仍然无法找出错误所在,请发布结果,以便其他人可以提供帮助。

解决此问题的另一种方法是在脚本开始时将%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"

另一种解决方法是在脚本开始时将%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"

而且它不会起作用。

但它不应该是必需的<代码>%~dp0应在批处理文件中的任何位置工作,而不考虑当前目录或任何其他因素。哦,抱歉。。。我刚读了最后一部分。。。你在寻找为什么会发生这种情况,而不是如何避开它?看我的编辑下面的原始答案你是我最初的地方-看我的答案。但是,不管当前目录是什么,代码要么可以工作,要么不能工作。但这不是必需的<代码>%~dp0应在批处理文件中的任何位置工作,而不考虑当前目录或任何其他因素。哦,抱歉。。。我刚读了最后一部分。。。你在寻找为什么会发生这种情况,而不是如何避开它?看我的编辑下面的原始答案你是我最初的地方-看我的答案。但是,无论当前目录如何,代码都应该工作或不工作。我记得我在
%~dp0
中遇到了相同的错误路径问题。但不幸的是,我无法复制它,也记不起我在哪里使用过它,这可能是Win7 vs的新效果XP@jeb-我记得有一个短路径名的bug(在XP上?),可能导致路径错误,例如
%~sdp0
。请告诉我,
%~dp0
没有新的错误-那将是可怕的:-(我记得我在
%~dp0
中遇到了同样的错误路径问题。但不幸的是,我无法复制它,也记不起我在哪里使用过它,这可能是Win7 vsXP@jeb-我记得有一个短路径名的bug(在XP上?)这可能会导致路径错误,例如
%~sdp0
。请告诉我
%~dp0
没有新的错误-这将非常糟糕:-(