2

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 ответ1

0

Это работает для меня, если вы поместите следующее в файл 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!
) 

Остерегайтесь имен файлов и каталогов, которые имеют восклицательный знак в имени файла, так как они, как правило, удаляются этим методом. Если вам нужно что-то более надежное, способное справиться с этим, изучите установку GNU sed или grep. Вы также можете исследовать с помощью команды GNU find, если вы не возражаете против имен файлов, возвращающихся в стиле UNIX с косой чертой вместо обратной косой черты и с начальным ./ перед каждой записью.

Есть также другой ответ, который может дать вам идеи по обработке восклицательных знаков при обработке CMD: https://stackoverflow.com/questions/32873578/how-to-read-a-string-with-from-a-file-in- окна-пакетный сценарий /32874195 # 32874195

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .