【问题标题】:In cmd, how to get path of folder with caret in name在cmd中,如何获取名称中带有插入符号的文件夹的路径
【发布时间】:2012-09-30 20:04:13
【问题描述】:

在 Windows 7 的 cmd 中,我知道 %~dp0 给出了批处理文件的文件夹路径,如 How to get folder path from file path with CMD

但是,如果路径中至少有一个插入符号 (^),则它不起作用。例如,C:\one^two^^three^^^four^^^^carets\ 中的批处理包含

echo %~dp0

给予

C:\onetwo^three^four^^carets\

我怎样才能摆脱插入符号?

【问题讨论】:

    标签: windows-7 batch-file path cmd caret


    【解决方案1】:

    你试过延迟变量扩展吗?

    echo !dp0
    

    我不知道它是否兼容引用剥离〜

    【讨论】:

    • 谢谢,但 "echo !dp0" 或 "echo %!dp0" 只给出 "!dp0"。
    • 没关系。我在手机上,所以无法测试。
    • 使用短文件名怎么样? %~fs0
    • 好的,再来一次怎么样? %~dps0 那是使用短文件名的目录+路径,巧合的是不会包含^。
    • 谢谢!虽然它不能完全回答我原来的问题,但 %~dps0 满足了我的需求。顺便说一句,%~fs0 包含批处理文件名。
    【解决方案2】:

    您得到了正确的值,但是当您 ECHO 值时,它必须经过另一层解析。未加引号的^ 是批处理转义字符,用于将具有含义的特殊字符(如&|)转换为简单的文字字符。未引用的插入符号后面的任何字符都将被转义并消耗插入符号。

    如果你只是简单地回显字符串文字,你会得到完全相同的结果:

    echo C:\one^two^^three^^^four^^^^carets\
    

    产量

    C:\onetwo^three^four^^carets\
    

    您可以通过引用字符串来保护插入符号,但随后您会在 ECHO 结果中得到引号:

    echo "%~dp0"
    

    您可以轻松地将原始值传输到环境变量而无需使用插入符号,并通过使用 SET 查看结果来证明:

    @echo off
    setlocal
    set "myPath=%~dp0"
    set myPath
    

    如果你想只回显不带引号的值,你可以使用延迟扩展。这是因为在解析特殊字符后发生延迟扩展:

    @echo off
    setlocal enableDelayedExpansion
    set "myPath=%~dp0"
    echo !myPath!
    

    您也可以通过将值传输到 FOR 变量来获得相同的结果。 FOR 变量的扩展也发生在特殊字符解析之后:

    @echo off
    for %%A in ("%~dp0") do echo %%~A
    

    【讨论】:

    • +1 获取详细说明和示例。 “回声!myPath!”解决方案是正确的。其他两个都将字符串括在引号中。
    • @Gnubie - 哎呀,谢谢!在我最后一个去掉引号的例子中,我错过了~。现在都修好了。
    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 2016-07-11
    • 2011-01-25
    • 2010-10-14
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多