在cmd中,如何获取名称中带有脱字符号的文件夹的路径

Gnu*_*bie 1 cmd path batch-file caret windows-7

在Windows 7的cmd中,我知道%〜dp0给出了批处理文件的文件夹路径,如 如何使用CMD从文件路径获取文件夹路径中所述

但是,如果路径中至少有一个插入符号(^),则此操作无效。例如,C:\ one ^ two ^^ three ^^^ fourfour ^^^^ carets \中的一批

echo %~dp0
Run Code Online (Sandbox Code Playgroud)

C:\onetwo^three^four^^carets\
Run Code Online (Sandbox Code Playgroud)

如何逃脱插入符号?

dbe*_*ham 5

您将获得正确的值,但是在您回显该值时,它必须经过另一层解析。未引用的^是批转义字符,用于将具有特殊含义的特殊字符(例如&和)|转换为简单的文字字符。跟随无引号的插入符后面的任何字符都将逃脱,并且插入符将被消耗。

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

echo C:\one^two^^three^^^four^^^^carets\
Run Code Online (Sandbox Code Playgroud)

产量

C:\onetwo^three^four^^carets\
Run Code Online (Sandbox Code Playgroud)

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

echo "%~dp0"
Run Code Online (Sandbox Code Playgroud)

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

@echo off
setlocal
set "myPath=%~dp0"
set myPath
Run Code Online (Sandbox Code Playgroud)

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

@echo off
setlocal enableDelayedExpansion
set "myPath=%~dp0"
echo !myPath!
Run Code Online (Sandbox Code Playgroud)

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

@echo off
for %%A in ("%~dp0") do echo %%~A
Run Code Online (Sandbox Code Playgroud)