【问题标题】:changing directory stops %~dp0 from working更改目录会使 %~dp0 停止工作
【发布时间】:2012-04-05 13:35:32
【问题描述】:

我在C:\ 驱动器上有两个批处理文件,我正在使用%~dp0 命令使用第一个脚本的路径来复制第二个批处理脚本:

COPY %~dp0"Hello World.BAT" C:\"Hello World.bak"

在脚本的早期,我需要更改到 C:\ 根目录下的子目录,但这会阻止上述复制命令运行,我得到的错误是“找不到文件”。如果我留在C:\ 的根目录中,则复制命令可以完美运行。任何想法为什么会发生这种情况。

【问题讨论】:

    标签: windows batch-file command prompt


    【解决方案1】:

    解决此问题的另一种方法是将 %~dp0 保存在脚本开头的另一个变量中。

    @echo off
    setlocal
    set filepath=%~dp0
    .
    .
    some code
    .
    .
    cd away from original path
    .
    .
    COPY "%filepath%Hello World.BAT" "C:\Hello World.bak"
    

    应该工作。

    我很想认为它不起作用的原因与您的报价有关。

    你有这个:

    COPY %~dp0"Hello World.BAT" C:\"Hello World.bak"
    

    用这个替换它:

    COPY "%~dp0Hello World.BAT" "C:\Hello World.bak"
    

    您需要将整个路径用引号括起来以确保它可以正常工作。如果你有:

    C:\Program Files\Somefolder\
    

    作为您的路径并使用引号,结果将如下所示:

    "C:\Program Files\Somefolder\""Hello World.bak"
    

    它不会起作用。

    【讨论】:

    • 但这应该没有必要。 %~dp0 应该在批处理文件中的任何位置工作,无论当前目录或任何其他因素如何。
    • 哦,对不起...我刚刚阅读了最后一部分...您正在寻找为什么会发生这种情况,而不是如何解决它?在原始答案下方查看我的编辑
    • 你是我最初所在的地方 - 请参阅我的答案。但是无论当前目录如何,代码都应该工作或不工作。
    【解决方案2】:

    我还没有完全弄清楚更改当前目录如何导致命令在更改之前运行时失败。但我注意到引号没有放在最佳位置。路径中的空格会导致命令失败,但在我看来,无论您当前的目录如何,它都应该失败。

    我会使用:

    COPY "%~dp0Hello World.BAT" "C:\Hello World.bak"
    

    将引号移到第一个参数的前面可能很重要。为第二个参数移动它并不重要,因为路径中显然没有空格,但对我来说看起来更好。

    编辑
    在更仔细地阅读了你的问题之后,我认为这个故事肯定还有更多内容。如果两个批处理文件都在 C 盘的根目录中,那么您发布的原始代码应该可以工作。

    尝试编辑您的脚本以诊断正在发生的事情。将 ECHO 放在复制命令之前,这样您就可以看到脚本试图做什么。 (或者只是确保 echo 已打开,但在输出中可能更难找到正确的行。)

    echo COPY %~dp0"Hello World.BAT" C:\"Hello World.bak"
    

    如果您仍然无法找出问题所在,请发布结果以便其他人提供帮助。

    【讨论】:

    • 我记得我遇到了与%~dp0 相同的问题,即路径错误。不过可惜我无法重现,也不记得在哪里用过,可能是Win7 vs XP的新效果
    • @jeb - 我记得一个带有短路径名的错误(在 XP 上?)可能导致错误的路径,例如 %~sdp0。请告诉我%~dp0 没有新的错误 - 那会很糟糕:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多