Как исключить каталог Windows в цикле FOR / R? - PullRequest
0 голосов
/ 16 мая 2019

Я хочу отобразить все файлы на диске C: но не файлы в каталоге Windows.Я могу сделать это с for /F, но не могу сделать это с for /R.

Проблема в том, что for /F слишком медленный для эхо-файлов, в то время как for /R действительно быстро.

for /F "tokens=* delims= " %%a in ('dir /b /s c:\*.* ^| find /V "C:\Windows\" ')

Приведенный выше код работает, но для вывода файлов на диске C требуется около часа, поскольку он ожидает результата dir и затем фильтрует их с помощью команды find.

Я попробовал код удара с for /R, но он не фильтрует каталог Windows.

for /r "c:\" %%a in (* ^| find /V "C:\Windows\" ')

Также я попытался немного кода отфильтровать каталог Windows после for /r что-то вроде этого:

for /R (*) do ( echo %%A | findstr /v "C:\windows" > null)

Но это медленно, как for /F.

Я хочу, чтобы решение рекурсивно отображало все файлы, но не файлы в каталоге Windows.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я согласен с комментарием dbenham в том, что вам вообще не нужен цикл For для этой задачи.

Я бы предложил:

Dir /B/S/A-D C:\*|Find /I /V "C:\Windows\"

или с использованием системных переменных:

Dir /B/S/A-D %SystemDrive%\*|Find /I /V "%SystemRoot%\"

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

0 голосов
/ 16 мая 2019

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

ItТакже возможно запустить этот пакетный файл с любой другой папкой, кроме C:, поскольку базовая папка передается в качестве аргумента пакетному файлу.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BaseFolder=C:\"
if not "%~1" == "" set "BaseFolder=%~1"
if not "%BaseFolder:~-1%" == "\" set "BaseFolder=%BaseFolder%\"

setlocal EnableDelayedExpansion
if not "!BaseFolder:%SystemRoot%\=!" == "%BaseFolder%" (
    endlocal
    endlocal
    echo Searching in any Windows folder is not done by %~nx0.
    echo/
    pause
    goto EndBatch
)
endlocal

rem Output non-hidden files in base folder.
for %%I in ("%BaseFolder%*") do echo %%I

rem For each folder in base folder except always ignored Windows folder
rem call the subroutine ProcessFolder with full qualified folder name.
for /D %%I in ("%BaseFolder%*") do if /I not "%%I" == "%SystemRoot%" call :ProcessFolder "%%I"

endlocal
goto EndBatch

rem The subroutine ProcessFolder runs a recursive search for all
rem non-hidden files in all folders (including hidden folders)
rem and outputs the full qualified names of all found files.
:ProcessFolder
for /R "%~1" %%J in (*) do echo %%J
goto :EOF

:EndBatch

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

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...