![如何使用当前目录名称而不是完整路径打印文件](https://linux22.com/image/1474217/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%E8%80%8C%E4%B8%8D%E6%98%AF%E5%AE%8C%E6%95%B4%E8%B7%AF%E5%BE%84%E6%89%93%E5%8D%B0%E6%96%87%E4%BB%B6.png)
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