如何从 For 命令中的 %~p 中删除尾随 \?

How do I remove trailing \ from %~p in a For command?

我有一个 Windows 使用以下命令的批处理文件

for /r %%i in (dir) do @echo %server%%%~pi>>%filename%

其中 %server% 是文件夹的网络位置(其他用户使用不同的驱动器映射),%filename% 是我存储结果的文本文件(出于调试目的这样做)。

文件中列出的文件夹以尾随反斜杠结尾,这似乎会在读取文件时引起一些问题。如何在不手动编辑创建的文件的情况下去掉结尾的反斜杠?

您可以将目录名称(带尾部反斜杠)分配给普通变量,然后用 0,-1 的子字符串变量扩展来排除最后一个字符,所有这些都在 for- 的命令列表中循环体:

for /r %%i in (dir) do @(set d=!server!%%~pi& echo !d:~0,-1!) >>!filename!

这里是help set:

关于子字符串变量扩展的帮助

May also specify substrings for an expansion.

%PATH:~10,5%

would expand the PATH environment variable, and then use only the 5 characters that begin at the 11th (offset 10) character of the expanded result. If the length is not specified, then it defaults to the remainder of the variable value. If either number (offset or length) is negative, then the number used is the length of the environment variable value added to the offset or length specified.

%PATH:~-10%

would extract the last 10 characters of the PATH variable.

%PATH:~0,-2%

would extract all but the last 2 characters of the PATH variable.

请注意,要使其正常工作,您 必须 启用 enabledelayedexpansion 并在 for 循环体中为变量使用 ! 定界符,以确保它在循环处理期间扩展,而不是在循环解析期间扩展。我还将 %filename% 更改为 !filename!,因为最好始终启用和使用此功能,即使它不是必需的。

一个更简单的解决方案是附加一个点并使用第二个 FOR 循环来获取规范化路径、名称和扩展名:

for /r %%i in (dir) do for %%F in ("%%~pi.") do echo %server%%%~pnxF>>%filename%

一个很大的优点是这不需要延迟扩展,因此您不必担心 ! 的路径在扩展 FOR 变量时被破坏。