3

Я знаю, что проводник Windows может раскрасить состояние сжатия NTFS файла, как в обычном, так и в поисковом представлении.

Как я могу специально фильтровать / искать файлы, сжатые или несжатые на уровне NTFS?

Предпочтительно решение, которое работает в Windows XP и выше (есть довольно много аппаратных устройств, для которых нет драйверов для чего-либо Vista и выше).

Поскольку Windows Search слишком загружает процессор, я бы хотел найти решение и без этого.

2 ответа2

6

Интерфейс командной строки

В Windows XP нет возможности составить список сжатых файлов «из коробки», и даже расширенные методы поиска не предназначены для таких задач. На помощь приходит командная строка:

cd /d "C:\Some folder"
compact | findstr /c:" 1 C"

Команда cd просто используется для перехода к целевому каталогу. Когда команда compact запускается без параметров, она перечисляет все файлы вместе с деталями их сжатия, если таковые имеются. Выходные данные могут быть отфильтрованы путем перенаправления его на findstr . Для чего стоит, этот метод должен работать даже на Windows 2000.

Тем не менее, вывод довольно многословен. Для извлечения дополнительной информации требуется еще немного работы:

for /f "tokens=9,*" %A in ('"compact | findstr /c:" 1 C" "') do @dir /b "%A*%B" 2>nul

Команда выше покажет только сжатые имена файлов. Команда dir поможет проверить имена файлов, чтобы избежать ложных срабатываний (например, тех, которые содержат строку 1 C в своем имени).

Дополнительные параметры, которые вы можете использовать:

  • /s Применяет команду ко всем подпапкам.
  • /a Отображает скрытые или системные файлы.

Обратите внимание, что эти параметры должны использоваться как для команд compact и для команд dir , если это необходимо.

Чтобы получить список несжатых файлов, вы можете использовать параметр /v команды findstr чтобы отменить фильтр и изменить значение tokens на 8 (это потому, что несжатые файлы не имеют маркера C , что влияет на токенизацию строки).

дальнейшее чтение


Расширенный синтаксис запроса

Поисковые запросы Windows указываются в расширенном синтаксисе запросов (AQS), который поддерживает не только простой текстовый поиск, но и предоставляет расширенные операции запросов на основе свойств.

Источник: Windows Search - расширенный синтаксис запроса

AQS был впервые представлен в Windows Desktop Search, который впоследствии был улучшен и интегрирован в Windows Vista как Windows Search. Вам необходимо установить его отдельно в более ранних операционных системах.

Следующий запрос выведет список всех файлов, для которых установлен атрибут архива и которые сжаты. Работает в Windows XP, Vista и 7. Он также должен работать в Windows 8.x, хотя я не тестировал.

System.FileAttributes:(2080)

На английском языке вы также можете использовать:

attributes:(2080)

Вот список наиболее полезных значений:

FILE_ATTRIBUTE_READONLY = 1
FILE_ATTRIBUTE_HIDDEN = 2
FILE_ATTRIBUTE_SYSTEM = 4
FILE_ATTRIBUTE_ARCHIVE = 32
FILE_ATTRIBUTE_COMPRESSED = 2048
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192

В приведенном выше примере я объединил FILE_ATTRIBUTE_ARCHIVE и FILE_ATTRIBUTE_COMPRESSED: 32 + 2048 = 2080 .

Вы можете искать любые комбинации, используя логический оператор OR . Например, для поиска сжатых файлов, которые доступны только для чтения или нет:

System.FileAttributes:(2080 OR 2081)

Чтобы инвертировать результаты поиска, вы можете использовать оператор NOT :

System.FileAttributes:NOT(2080 OR 2081)

дальнейшее чтение

0

and31415 опубликовал хорошее решение для Windows Explorer, которое работает по крайней мере в Windows 7 и выше (возможно, в Vista, проверю это позже).

Поэтому для более старых версий Windows, таких как XP и 2003, я искал решение для командной строки, которое могло бы генерировать список сжатых или несжатых файлов.

Compact: хорошо, но выходной файл трудно разобрать

Первой идеей было использование compact, который поставляется вместе с Windows.

И действительно, он может перечислять файлы (заключать параметры в двойные кавычки, когда они содержат пробелы):

compact [filemask] /a /s:[directoryname]

Формат легко читается для людей, но не легко разобрать.

В FindCompressed есть ошибка с длинными именами путей, дающими списки, подобные этому:

C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\htmlinit3.htm
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\htmlpagenav.htm
...
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\html\imagessplash.jpg
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\imagestoolsbg.gif
...
C:\Program Files\VMware\Infrastructure\Virtual Infrastructure Client\Help\en\DRS41\wwhelp\wwhimpl\common\scriptsunidata.js

Таким образом, он обрезает части файлов или каталогов, когда имена становятся слишком длинными.

# FindCompressed: хорошо, вывод первой / последней строки должен быть удален

Исход разработчик написал инструмент командной строки FindCompressed. Без параметров находит сжатые файлы. С параметром -su он находит несжатые файлы. Заключите [directoryname] имя_каталога ] в двойные кавычки, если оно содержит пробелы.

FindCompressed.exe -su [имя_каталога]

FindCompressed есть один недостаток: он всегда начинает вывод с этой строки, где # - это [ имя_каталога ]:

Recursive search of compact #.

и заканчивается такой строкой:

Found # uncompressed files in # items examined. 

Строки между ними содержат полный путь к несжатому или сжатому имени файла.
Это легко разобрать.

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