Windows 从%dp0%的路径复制文件无效

Windows 从%dp0%的路径复制文件无效,windows,batch-file,cmd,Windows,Batch File,Cmd,请注意,我错误地认为应该使用%~dp0%从批处理文件中获取不包括文件名的路径。我留下这个问题,就像我看到其他人有同样的错误前提一样。有关更多信息,请参阅已接受的答案及其评论 许多更高级的Windows用户都知道,批处理文件中的表达式%~dp0%将计算到批处理文件的目录中,包括尾部的反斜杠 如果我在D:\中有一个包含echo%~dp0%的批处理文件,该行将按预期运行并输出D:\ 问题 如果我创建一个文件D:\FILETOCOPY.txt和一个批处理文件D:\problem.bat,包含以下内容:

请注意,我错误地认为应该使用
%~dp0%
从批处理文件中获取不包括文件名的路径。我留下这个问题,就像我看到其他人有同样的错误前提一样。有关更多信息,请参阅已接受的答案及其评论


许多更高级的Windows用户都知道,批处理文件中的表达式
%~dp0%
将计算到批处理文件的目录中,包括尾部的反斜杠

如果我在
D:\
中有一个包含
echo%~dp0%
的批处理文件,该行将按预期运行并输出
D:\

问题

如果我创建一个文件
D:\FILETOCOPY.txt
和一个批处理文件
D:\problem.bat
,包含以下内容:

@ECHO OFF

copy D:\FILETOCOPY.txt %userprofile%\FILECOPIEDA.txt

copy %~dp0%FILETOCOPY.txt %userprofile%\FILECOPIEDB.txt

set Evaluated=%~dp0%FILETOCOPY.txt
copy %Evaluated% %userprofile%\FILECOPIEDC.txt

cmd.exe
我在运行时(通过双击)得到此输出:

并且目标中缺少文件
%userprofile%\FILECOPIEDB.txt
。如
FILECOPIEDC.txt
所证明的,如果我在单独的一行中计算
%~dp0%
,它确实有效。它似乎以某种方式弄乱了文件拷贝,但是它在回音线中间像预期的那样工作。


这到底是怎么回事?

试试
%~dp0
而不是
%~dp0%

您的命令转换为(为清晰起见插入括号和下划线)


由于变量
%FILETOCOPY.txt%
不存在,它将被一个空字符串替换。

请尝试
%~dp0
而不是
%~dp0%

您的命令转换为(为清晰起见插入括号和下划线)


由于变量
%FILETOCOPY.txt%
不存在,它将被一个空字符串替换。

两个连续的
\
在Windows中被视为一个
\
。这不是问题

如果您的%userprofile%包含空格或
&
,请将整个术语用双引号括起来


还提到了另一点-术语应该是
%~dp0

在Windows中,两个连续的
\
被视为一个
\
。这不是问题

如果您的%userprofile%包含空格或
&
,请将整个术语用双引号括起来


还提到了另一点-术语应该是
%~dp0

将三个调用改为
copy
echo
,然后运行批处理文件。仔细查看输出,尤其是第二个回波的输出。您是否看到两个单独的语句(如第一个和第三个)?将三个调用改为
copy
改为
echo
,然后运行批处理文件。仔细查看输出,尤其是第二个回波的输出。您是否看到了两个单独的语句(如第一个和第三个)?这是有效的,如果最后一个百分比登录
%~dp0%
不应该出现,我理解您描述的评估。但是你能不能加一行解释第二个
%
错误的原因?我的印象是批处理文件中的变量总是被
%
-符号包围。@kyl:%0是命令行参数替换,而不是环境变量替换。语法不同。@Harry:很高兴知道!这是可行的,如果最后一个百分比登录
%~dp0%
不在那里,我理解您描述的评估。但是你能不能加一行解释第二个
%
错误的原因?我的印象是批处理文件中的变量总是被
%
-符号包围。@kyl:%0是命令行参数替换,而不是环境变量替换。语法不同。@Harry:很高兴知道!
        1 file(s) copied.
The system cannot find the path specified.
        1 file(s) copied.
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

D:\>
copy [%~dp0]_[%FILETOCOPY.txt %] userprofile_[%\FILECOPIEDB.txt]