一種方法是嵌套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"