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]