2015-09-14 2 views
0

Я хочу найти файлы с .log расширение рекурсивно в каталоге. Я пытаюсь сделать команду ниже в командном файле.Как искать файлы с помощью командного файла и получить относительный путь к файлу не полный путь?

for /R %%A in (*.log) do echo %%A >> All_logs.txt 

Я попытался это также:

for /R %%A in (*.log) do echo %%~nxA >> All_logs.txt 

Но я либо полный путь, как это:

D:\Folder1\sub_folder1\bootmicro.log 
D:\Folder1\sub_folder2\debug.log 

или

bootmicro.log 
debug.log 

соответственно.

Поскольку я бегу пакетный файл в пути D: \ Folder1, я хочу найти результат быть похожим:

sub_folder1\bootmicro.log 
sub_folder2\debug.log 

Кроме того, в том же пакетный файл, я хочу создать папки с помощью результирующие имена файлов, как показано ниже:

sub_folder1_bootmicro_log_Analysis 
sub_folder2_debug_log_Analysis 

или

sub_folder1_bootmicro.log_Analysis 
sub_folder2_debug.log_Analysis 

Как я могу это сделать?

ответ

3

Когда вы вызываете xcopy с относительным путем, вы получаете список файлов для копирования (/l означает только получить список) с относительными путями.

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f "tokens=1,* delims=\" %%a in (' 
     xcopy /l /s .\*.log "%temp%" 
    ') do if not "%%b"=="" echo(%%b 

Цикл for /f будет обрабатывать список удаления исходного .\ (с помощью обратной косой черты в качестве разделителя) для каждого файла в списке.

Поскольку вывод из xcopy будет содержать и завершать строку с количеством файлов, и эта строка не будет иметь второго токена, для включения пустой строки в конец будет включен if.

отредактирован Для создания папки, замедленное расширение будет необходимо для работы с заменой строки, но, чтобы избежать проблем с ! включены в любой из файлов/имен папок, он должен быть включен/выключен, когда это необходимо.

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f "tokens=1,* delims=\" %%a in (' 
     xcopy /l /s .\*.log "%temp%" 
    ') do if not "%%b"=="" (
     echo(%%b 
     set "target=%%b" 
     setlocal enabledelayedexpansion 
     for %%c in ("!target:\=_!") do (
      endlocal 
      md "%%~c_Analysis" 
     ) 
    ) 
+2

Хорошая идея с использованием 'xcopy', чтобы получить относительные пути; Я думал об использовании 'forfiles', который способен возвращать относительные пути (' @ relpath'), но всегда есть раздражающие кавычки вокруг вывода; поэтому было бы довольно сложно удалить их и построить новый относительный путь по просьбе ... – aschipfl

+2

@aschipfl, Не очень отличается. Протестировано из командной строки 'forfiles/m * .log/s/c" cmd/v/q/c для/f tokens^= 1 ^, *^delims^= \% a in (@relpath) установить x = \ "% b \" & echo md ^! x: \ = _ ^! "'. Идеальная действительная идея. Я склонен не использовать 'forfiles', если есть другая альтернатива, потому что мне не нравится запускать один экземпляр' cmd' для каждой команды. Просто мои плохие привычки. –

+0

Ваши привычки не так уж плохи, @MCND ;-) – aschipfl

0

Похожие с Forfiles

for /F "usebackq delims=" %%a in (`forfiles /s /m *.txt /C "cmd /c echo @relpath"`) do (
    set "myfile=%%~a" 
    setlocal EnableDelayedExpansion 
    set "myfile=!myfile:~2! 
    for %%c in ("!myfile:\=_!") do (
    endlocal 
    echo md "%%~c_Analysis" 
) 
) 
Exit /B