从%~dp0%的路径复制文件不起作用

时间:2014-01-23 03:19:16

标签: windows batch-file cmd

请注意,我错误地认为我应该使用 %~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

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

        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:\>

目的地中缺少文件%userprofile%\FILECOPIEDB.txt。如果我在单独的一行评估FILECOPIEDC.txt%~dp0%证明它确实有效。它似乎以某种方式弄乱了文件副本,但它在回显线的中间按预期工作。

完全这里发生了什么?

2 个答案:

答案 0 :(得分:5)

尝试%~dp0而非%~dp0%

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

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

由于变量%FILETOCOPY.txt %不存在,因此将替换为空字符串。

答案 1 :(得分:3)

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

如果您的%userprofile%包含空格或&,则用双引号括住整个字词。

已提到另一点 - 该术语应为%~dp0