Как найти папки, не содержащие определённых файлов

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
Ciber SLasH
Сообщения: 209
Зарегистрирован: Сб авг 20, 2005 21:41
Откуда: С.-Петербург

Сообщение Ciber SLasH »

Попытка ответить самому себе на 2 вопрос:

Код: Выделить всё

@echo off
setlocal ENABLEEXTENSIONS
chcp 1251 > nul

set "mask=*.jpg *.jpeg *.jp2 *.jpc *.gif *.png *.psd *.tif *.pcx *.tga *.bmp *.htm *.html *.shtm *.shtml *.txt *.avi *.mpg *.mpeg *.m2v *.mpe *.asf *.mov *.rm *.doc* *.xls* *.ppt*"
set input="%~dp0test.txt"
set output="%~dp0--.lst"

if not [%input%]==[""] (
	if exist %input% (
		for /f "usebackq delims==" %%i in (%input%) do (
			pushd "%%i"
			for /d /r %%j in (*) do (
				title "%%j"
				rem pushd "%%j"
				>nul 2>&1 dir /b/a-d/s %mask% || >>%output% echo(%%j\
				rem popd
			)
			popd
		)
	) else (
		echo Error: file [%input%] not found!
	)
) else (
	echo Usage: %~nx0 ^<File-list^>
)
Но не хочет работать, если файл test.txt содержит русские имена :(
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Попробуй:

Код: Выделить всё

for /f "usebackq delims==" %%i in (`type %input%`)
И входной файл в юникоде с маркером.
Аватара пользователя
Ciber SLasH
Сообщения: 209
Зарегистрирован: Сб авг 20, 2005 21:41
Откуда: С.-Петербург

Сообщение Ciber SLasH »

Скрипт заработал (я ошибся в указании путей)

Код: Выделить всё

@echo off
setlocal ENABLEEXTENSIONS
chcp 1251 > nul

set input="%~dp0test.txt"
set output="%~dp0--.lst"
:: Archives
set "mask=*.zip *.rar *.7z *.tgz *.gz *.tar *.bz2"
:: IMG
set "mask=%mask% *.iso *.nrg"
:: Graph
set "mask=%mask% *.jpg *.jpeg *.jp2 *.jpc *.gif *.png *.psd *.tif *.pcx *.tga *.bmp"
:: HTML
set "mask=%mask% *.htm *.html *.shtm *.shtml *.mht*"
:: Audio
set "mask=%mask% *.mp3 *.flac *.ape *.wma"
:: Video
set "mask=%mask% *.avi *.mpg *.mpeg *.m2v *.mpe *.asf *.mov *.rm"
:: Docs
set "mask=%mask% *.txt *.doc* *.xls* *.ppt* *.pdf"

if not [%input%]==[""] (
	if exist %input% (
		copy nul %output% > nul
		for /f "usebackq delims==" %%i in (%input%) do (
			echo -----
			echo Scan: %%i
			echo -----
			pushd "%%i"
			dir /b /a-d /s %mask% > nul 2>&1 || echo(%%i>>%output%
			for /d /r %%j in (*) do (
				REM title %%j
				echo %%j
				dir /s /b /a-d %mask% > nul 2>&1 || echo(%%j\>>%output%
				rem >nul 2>&1 dir /s /b /a-d %mask% || >>%output% echo(%%j\
			)
			popd
		)
	) else (
		echo Error: file [%input%] not found!
	)
) else (
	echo Usage: %~nx0 ^<File-list^>
)
test.txt

Код: Выделить всё

C:\RECYCLER\
C:\tmp\
Добавлено спустя 55 минут:

С первым вопросом разобрался:
>nul 2>&1 dir /b/a-d/s %mask% || >>"%output%" echo(%%$\
Выполнить поиск файлов по всем вложенным каталога, начиная с текущего, соответствующих маске (при этом перенаправление ошибок и вывода идёт на ус-во null, чтобы не было никакого вывода и установился флаг %ERRORLEVEL%). Если файлов таких нет, то выполняется вторая команда после || которая записывает в выходной файл путь.
По идее можно переписать так:
dir /b/a-d/s %mask% > nul 2>&1 || echo(%%$\>>"%output%"

Все вопросы решены, тему можно закрывать :wink:
Ответить