dir /b /s
这将打印:
D:\stuff\tmp>dir /b /s D:\stuff\tmp\A.java D:\stuff\tmp\AAA D:\stuff\tmp\B.java D:\stuff\tmp\C.java D:\stuff\tmp\Why.class D:\stuff\tmp\Why.java D:\stuff\tmp\XX.class D:\stuff\tmp\XX.java D:\stuff\tmp\XX.txt D:\stuff\tmp\AAA\aaa.kkk
我需要打印:
D:\stuff\tmp>???? tmp\A.java tmp\AAA tmp\B.java tmp\C.java tmp\Why.class tmp\Why.java tmp\XX.class tmp\XX.java tmp\XX.txt tmp\AAA\aaa.kkk
我怎样才能做到这一点?
答案1
如果您将以下内容放入 CMD 文件中,这对我来说是有效的:
@echo off
SETLOCAL EnableDelayedExpansion
for /f "usebackq delims=" %%A in (`cmd /c dir /s /b`) DO (
set NAME=%%A
set SHORT=!NAME:%cd%\=!
echo.!SHORT!
)
它获取原始命令的输出dir
并使用字符串替换来删除当前目录。set /?
有关此内容的更多信息,请参阅。如果您希望将目录作为参数传递,而不是使用当前目录,请尝试对变量进行以下修改:
@echo off
SETLOCAL EnableDelayedExpansion
for /f "usebackq delims=" %%A in (`cmd /c dir /s /b %1`) DO (
set NAME=%%A
set SHORT=!NAME:%~1\=!
echo.!SHORT!
)
小心文件名和目录中包含感叹号,因为它们往往会被这种方法删除。如果您需要更强大的工具来处理这个问题,请考虑安装 GNUsed或者grep。您还可以使用 GNU寻找命令,如果您不介意文件名以斜杠而不是反斜杠的形式返回 UNIX 样式,并且./
在每个条目前面有一个前导。
还有另一个答案可能会给你提供在 CMD 处理中处理感叹号的想法:https://stackoverflow.com/questions/32873578/how-to-read-a-string-with-from-a-file-in-windows-batch-script/32874195#32874195