【问题标题】:Copying files from a path with %~dp0% does not work从具有 %~dp0% 的路径复制文件不起作用
【发布时间】:2014-01-23 03:19:16
【问题描述】:

请注意,我错误地假设我应该使用%~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。如果我在单独的行上评估%~dp0%,它确实有效,正如FILECOPIEDC.txt 所证明的那样。似乎它以某种方式弄乱了文件副本,但它在回显行的中间按预期工作。

确实这是怎么回事?

【问题讨论】:

  • 将三个调用copy改为echo,然后运行批处理文件。仔细查看输出,尤其是第二个echo。您是否看到两个单独的语句(例如第一个和第三个)?

标签: windows batch-file cmd


【解决方案1】:

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

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

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

由于变量%FILETOCOPY.txt %不存在,所以会被一个空字符串代替。

【讨论】:

  • 那行得通,如果%~dp0% 中的最后一个百分号不应该出现,我理解您所描述的评估。但是您能否添加一行来解释为什么第二个% 是错误的?我的印象是批处理文件中的变量总是被%-signs 包围。
  • @kyl: %0 是命令行参数替换,而不是环境变量替换。语法不同。
  • @Harry:很高兴知道!
【解决方案2】:

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

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

另外一点已经提到了——这个词应该是%~dp0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2019-06-22
    • 2017-01-05
    • 1970-01-01
    • 2018-01-12
    • 2017-07-12
    相关资源
    最近更新 更多