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

bon*_*zai 1 windows cmd batch-file

请注意,我错误地认为我应该使用 %~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
Run Code Online (Sandbox Code Playgroud)

当我在它上面运行它(通过双击)时,我得到了这个输出:

        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:\>
Run Code Online (Sandbox Code Playgroud)

并且%userprofile%\FILECOPIEDB.txt目标中缺少该文件.FILECOPIEDC.txt如果我%~dp0%在另一条线上进行评估,它确实有效.似乎它以某种方式混淆了文件副本,但它在回显线的中间按预期工作.

究竟是怎么回事?

Mag*_*goo 5

%~dp0不要试试%~dp0%.

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

copy [%~dp0]_[%FILETOCOPY.txt %] userprofile_[%\FILECOPIEDB.txt]
Run Code Online (Sandbox Code Playgroud)

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