批处理:文件名中的百分号

4

我认为这是一个简单的批处理编程问题,但是经过多次搜索,我找不到答案。

我试图找出如何引用文件名中包含困难字符的文件。

似乎双引号会对大多数封闭的字符进行字面处理。例如,对于一个名为^^.txt的文件,dir "^^.txt"将找到该文件,而dir ^^.txt则不会。

然而,我不知道如何转义%。例如,对于一个名为%ERRORLEVEL%.txt的文件,以下任何一项都无法找到该文件:

dir "%ERRORLEVEL%.txt"
dir "%%ERRORLEVEL%%.txt"
dir "^%ERRORLEVEL^%.txt"

任何建议将不胜感激。


@KenWhite,实际上你可以。尝试使用echo >^%ERRORLEVEL^%.txt - Mark Tolonen
@KenWhite,不正确:命名文件、路径和命名空间 - Alex Filipovici
啊,我以为它在无效字符列表中,比如 :<。我错了。 :-) - Ken White
% 在文件名中是合法的,例如 Alcohol 120% - Endoro
3个回答

5
Windows命令提示符的转义字符是^,不需要引号即可使用。
dir ^%errorlevel^%.txt

针对您提出的另一个例子 ^^.txt,请使用以下命令:

dir ^^^^.txt

谢谢,那个可行!你能用^来转义空格吗?例如,对于名为“Hello world.txt”的文件,dir Hello^ world.txt似乎找不到该文件。在这里,我可以使用带有dir的引号,但如果文件名同时包含%和空格怎么办? - Matthew White
使用引号来包含有空格的内容。百分号符号%可以正常工作,所以dir "%error level%.txt"是可行的。无法直接删除的文件是那些带有有效环境变量和空格的文件,例如%errorlevel% %date%.txt。可以使用批处理文件来删除这些文件,命令为del "%%errorlevel%% %%date%%.txt" - Mark Tolonen
1
@mdb - 从技术上讲,这并不是转义“%”扩展。变量扩展寻找名为“errorlevel^”的变量,但如果找不到它,它只是保留“%”(仅限命令行)。插入符号在DIR命令实际执行之前被剥离。如果变量“errorlevel^”存在,则会通过“%errorlevel^%”进行扩展。插入符号可以出现在百分号之间的任何位置。例如,从命令行中使用“%error^level%”同样有效。 - dbenham

1

在文件名中,永远避免使用 % 和 ^ 符号。在全局文件管理器中将 % 重命名为“percent”。

They are next to impossible to handle properly in many batch commands.

0
在批处理脚本中,您必须将%加倍,例如:
@echo off 
dir %%errorlevel%%.txt

顺便说一下,您不应该将cmd默认变量或命令名称用于其他事情(例如errorlevel)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接