一种方法是嵌套forfiles
内for %I
循环并使用%~I
膨胀(双万一被批处理文件中所使用的代码的%
):
forfiles /P "C:\root" /M "*.txt" /C "cmd /Q /C for %I in (@relpath) do echo %~I"
文件返回的列表将是(依赖于样品文件从原来的问题):
.\file1.txt
.\file2.txt
另一个变型是巢另一个forfiles
在初始一个的主体中,因为forfiles
去除(非转义)给定的字符串等的命令行内双引号后/C
:
forfiles /P "C:\root" /M "*.txt" /C "cmd /C forfiles /P @path\.. /M @file /C \"cmd /C echo @relpath\""
或者可选地(在一倍内forfiles
是故意的,这个作品围绕一个错误 - 见this post):
forfiles /P "C:\root" /M "*.txt" /C "forfiles forfiles /P @path\.. /M @file /C \"cmd /C echo @relpath\""
内forfiles
将枚举恰好一个项目,这是一个由外环过去了。由于@relpath
在执行内部循环时已扩展,所以引号将被删除,因为它们不会被转义。
所以文件返回列表看起来像(再次从原来的问题采取的示例文件):由forfiles
产生
.\file1.txt
.\file2.txt
附加线之间断行。您可避免使用重定向(解雇forfiles
输出,但在控制台窗口中显示只有echo
输出):
> nul forfiles /P "C:\root" /M "*.txt" /C "cmd /C forfiles /P @path\.. /M @file /C 0x22cmd /C > con echo @relpath0x22"