2015-01-26 85 views
2

我有一个使用下面的命令如何在For命令中删除%〜p后面的?

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

其中,%服务器%是文件夹的网络位置(其它用户使用不同的驱动器映射)和%文件名%是我存储在文本文件中的Windows批处理文件结果(通过这种方式进行调试)。

在文件中列出的文件夹最终会产生尾部反斜杠,这似乎在读取文件时会引起一些问题。我怎样才能摆脱尾随的反斜杠,而无需手动编辑创建的文件?

回答

0

您可以将目录名称(使用尾部反斜杠)分配给普通变量,然后使用子字符串变量扩展0和-1对其进行回显以排除最后一个字符,全部位于for-loop的命令列表中身体:

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

下面是从help set子字符串变量扩展的帮助:

还可以指定为子扩张。

%PATH:~10,5% 

会扩展PATH环境变量,然后只能使用5个 字符开始在第11(偏移10)膨胀 结果的字符。如果未指定长度,则默认为 变量值的其余部分。如果其中一个数字(偏移量或长度)为 为负数,则使用的数字是环境变量 的值的长度,该值添加到指定的偏移量或长度。

%PATH:~-10% 

会提取PATH变量的最后10个字符。

%PATH:~0,-2% 

会提取除PATH变量的最后2个字符以外的所有字符。

注意,对于这个工作,你必须使enabledelayedexpansion并使用!分隔符变量在for循环体,以确保它循环处理期间膨胀,而不是在循环的解析。我还将%filename%更改为!filename!,因为始终启用和使用此功能是一种很好的做法,即使它不是必需的。

+0

这正是我所需要的。这样一个简单的任务,但答案躲过了我。 – 2015-01-26 18:37:18

+0

Dosbatch中没有什么是简单的。 ;) – bgoldst 2015-01-26 18:40:21

+0

如果路径包含'!'字符,则会遇到问题。这可以通过在循环中打开和关闭延迟扩展来解决。但有一个[更好的解决方案](http://stackoverflow.com/a/28163790/1012053)。 – dbenham 2015-01-27 05:28:13

1

一个简单的办法是追加一个点,并使用第二个FOR循环得到的归一化的路径,名称和扩展名:

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

的一大好处是,这并不需要延迟扩展,所以你不要当FOR变量被展开时,不必担心!被损坏的路径。