请注意,我错误地认为我应该使用 %~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%
证明它确实有效。它似乎以某种方式弄乱了文件副本,但它在回显线的中间按预期工作。
完全这里发生了什么?
答案 0 :(得分:5)
尝试%~dp0
而非%~dp0%
。
您的命令转换为(为清晰起见而插入的括号和下划线)
copy [%~dp0]_[%FILETOCOPY.txt %] userprofile_[%\FILECOPIEDB.txt]
由于变量%FILETOCOPY.txt %
不存在,因此将替换为空字符串。
答案 1 :(得分:3)
在Windows中,连续两个\\
被视为单个\
。这不是问题。
如果您的%userprofile%包含空格或&
,则用双引号括住整个字词。
已提到另一点 - 该术语应为%~dp0