Для l oop - обратите внимание на изменение каталога из списка файлов - PullRequest
0 голосов
/ 29 марта 2020

У меня есть mytextfile.txt файл, содержащий список файлов, которые я хочу обработать.

Список выглядит так:

"Z:\Folder 1\filename 01.doc"
"Z:\Folder 1\filename 02.doc"
"Z:\Folder 2\filename 01.doc"
"Z:\Folder 2\filename 02.doc"
"Z:\Folder 2\filename 03.doc"
"Z:\Folder 3\filename 01.doc"

Мой код:

for /f "usebackq tokens=*" %%D in (mytextfile.txt) do (
 :: I only want to echo the directory every time it comes across a different one.
 echo Directory - "%%~dpD"
 :: Here is fine, I want to process the files now in the code below.
 echo Filename  - "%%~nD"
 )

Это выводит в буфер:

Directory - "Z:\Folder 1\"
Filename  - "filename 01"
Directory - "Z:\Folder 1\"
Filename  - "filename 02"
Directory - "Z:\Folder 2\"
Filename  - "filename 01"
Directory - "Z:\Folder 2\"
Filename  - "filename 02"
Directory - "Z:\Folder 2\"
Filename  - "filename 03"
Directory - "Z:\Folder 3\"
Filename  - "filename 01"

Тогда как это желаемый вывод:

Directory - "Z:\Folder 1\"
Filename  - "filename 01"
Filename  - "filename 02"
Directory - "Z:\Folder 2\"
Filename  - "filename 01"
Filename  - "filename 02"
Filename  - "filename 03"
Directory - "Z:\Folder 3\"
Filename  - "filename 01"

Обратите внимание, что каталог выводится только один раз.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Следующая методика просто сохраняет имена родительских каталогов как переменную, а затем проверяет это по сравнению с предыдущим значением, чтобы определить, следует ли Echo it:

@SetLocal DisableDelayedExpansion
@For %%G In (PDir PPDir)Do @Set "%%G="
@For /F "Delims=" %%G In ('""%__AppDir__%Sort.exe" "mytextfile.txt" 2>NUL"'
)Do @(Set "PDir=%%~dpG"
    SetLocal EnableDelayedExpansion
    If /I Not "!PPDir!"=="!PDir!" Echo Directory - "!PDir:~,-1!"
    EndLocal
    Echo Filename  - "%%~nG"
    Set "PPDir=%%~dpG")
@Pause
@EndLocal

Это не проверено, но я бы ожидайте, что его вывод будет выглядеть так:

Directory - "Z:\Folder 1"
Filename  - "filename 01"
Filename  - "filename 02"
Directory - "Z:\Folder 2"
Filename  - "filename 01"
Filename  - "filename 02"
Filename  - "filename 03"
Directory - "Z:\Folder 3"
Filename  - "filename 01"

Вы заметите, что я использовал sort, чтобы сначала убедиться, что любое повторение путей в любом месте текстового файла будет возвращено вместе.

Если вы не хотите использовать sort, то этого должно быть достаточно:

@Echo Off
Title Outputting directories and their files from a file list
Color 5F
SetLocal DisableDelayedExpansion
Set "ITF=%Temp%\music-checker-list.txt"
For /F "Tokens=*" %%G In ('ChCp') Do For %%H In (%%G) Do Set "CCp=%%~nH"
If Not %CCp% Equ 65001 ChCp 65001 >NUL
For %%G In (PDir PPDir)Do @Set "%%G="
For /F "UseBackDelims=" %%G In ("%ITF%")Do (Set "PDir=%%~dpG"
    Set "NFile=%%~G"
    SetLocal EnableDelayedExpansion
    If /I Not "!PPDir!"=="!PDir!" Echo Directory - "!PDir:~,-1!"
    Call :Process_Files "!NFile!"
    EndLocal
    Set "PPDir=%%~dpG")
Pause
GoTo :EOF

:Process_Files
Echo Full file name - %1
Exit /B

Ответ выше был скорректирован для того, чтобы измененный список имен и последующий код раздела редактирования были в вашем собственном коде. при условии правильного ответа обрабатывают амперсанды и проценты.

0 голосов
/ 29 марта 2020

Основываясь на ответе @Compo, я остановился на следующем:

@echo off & title Example to go through a list of file and echo, Directory then files... & color 5F & chcp 65001 >NUL
setlocal EnableDelayedExpansion

set "fileList=%temp%\file-list.txt"

for /f "usebackq tokens=*" %%D in (!fileList!) do (
  set "dirBase=%%~dpD"
  setlocal EnableDelayedExpansion
  if /i not "!dirNext!"=="!dirBase!" echo Directory - "!dirBase:~,-1!"
  endlocal
  echo Filename  - "%%~nD"
  set "dirNext=%%~dpD"
  )

РЕДАКТИРОВАТЬ

Для вызова в другую функцию. .

Любые символы % необходимо удвоить, чтобы это произошло.

Возьмите этот файл file-list.txt, например:

"Z:\Folder 100%\filename 01.doc"
"Z:\Folder 100%\filename 02.doc"
"Z:\Folder 100%\filename 01.doc"
"Z:\Folder 100%\filename 02.doc"
"Z:\Folder 100%\filename 03.doc"
"Z:\Folder 100%\filename 01.doc"
"Z:\Folder & 100%\filename 01.doc"
"Z:\Folder & 100%\filename 02.doc"
"Z:\Folder & 100%\filename 01.doc"
"Z:\Folder & 100%\filename 02.doc"
"Z:\Folder & 100%\filename 03.doc"
"Z:\Folder & 100%\filename 01.doc"
"Z:\Folder & 90 Percent\filename 01.doc"

Верх код потерпит неудачу, так как % будет пропущен.

Приведенный ниже код устраняет эту проблему, удваивая любой из символов для их выхода.

@echo off & title Example to go through a list of file and echo, Directory then files... & color 5F & chcp 65001 >NUL
setlocal EnableDelayedExpansion

:: Other code here

rem set "fname=%%~D"
rem This line takes above takes care of any lines in the text file that have
rem percent symbols in by doubling them up to escape them.
:LOOP_THROUGH_LINES_OF_TEXTFILE
set "fileList=%Temp%\music-checker-list.txt"
for /f "usebackq tokens=*" %%D in (!fileList!) do (
  set "dirBase=%%~dpD"
  setlocal EnableDelayedExpansion
  if /i not "!dirNext!"=="!dirBase!" echo Directory - "!dirBase:~,-1!"
  endlocal
  set "fname=%%~D" && setlocal enabledelayedexpansion && set "nname=!fname:%%=%%%%!"
  call :PROCESS_FILES "!nname!"
  set "dirNext=%%~dpD"
  )
goto :EOF

:PROCESS_FILES
echo Full File Name - "%~f1"
goto :EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...