我有一个使用下面的命令如何在For命令中删除%〜p后面的?
for /r %%i in (dir) do @echo %server%%%~pi>>%filename%
其中,%服务器%是文件夹的网络位置(其它用户使用不同的驱动器映射)和%文件名%是我存储在文本文件中的Windows批处理文件结果(通过这种方式进行调试)。
在文件中列出的文件夹最终会产生尾部反斜杠,这似乎在读取文件时会引起一些问题。我怎样才能摆脱尾随的反斜杠,而无需手动编辑创建的文件?
我有一个使用下面的命令如何在For命令中删除%〜p后面的?
for /r %%i in (dir) do @echo %server%%%~pi>>%filename%
其中,%服务器%是文件夹的网络位置(其它用户使用不同的驱动器映射)和%文件名%是我存储在文本文件中的Windows批处理文件结果(通过这种方式进行调试)。
在文件中列出的文件夹最终会产生尾部反斜杠,这似乎在读取文件时会引起一些问题。我怎样才能摆脱尾随的反斜杠,而无需手动编辑创建的文件?
您可以将目录名称(使用尾部反斜杠)分配给普通变量,然后使用子字符串变量扩展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!
,因为始终启用和使用此功能是一种很好的做法,即使它不是必需的。
一个简单的办法是追加一个点,并使用第二个FOR循环得到的归一化的路径,名称和扩展名:
for /r %%i in (dir) do for %%F in ("%%~pi.") do echo %server%%%~pnxF>>%filename%
的一大好处是,这并不需要延迟扩展,所以你不要当FOR变量被展开时,不必担心!
被损坏的路径。
这正是我所需要的。这样一个简单的任务,但答案躲过了我。 – 2015-01-26 18:37:18
Dosbatch中没有什么是简单的。 ;) – bgoldst 2015-01-26 18:40:21
如果路径包含'!'字符,则会遇到问题。这可以通过在循环中打开和关闭延迟扩展来解决。但有一个[更好的解决方案](http://stackoverflow.com/a/28163790/1012053)。 – dbenham 2015-01-27 05:28:13