Показаны только файлы ADS

Показаны только файлы ADS

В настоящее время я использую код для отображения файлов альтернативного потока данных (ADS) в cmd.exeформате dir /R.

Однако это приводит к отображению списка всех моих других файлов, помимо файлов ADS.

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


Команда dir C:\ /r /s | findstr /r "\$DATA"- лучшее, что я смог найти, хотя я не слишком уверен в ее точности. Есть еще какие-нибудь?

решение1

AltStreamDumpУтилита (от Nirsoft) также может это сделать.

EDIT: Также есть приложение с графическим интерфейсомАльтернативныйПотокПросмотр(тоже Nirsoft), которые поддерживают командную строку и позволяют, например, экспортировать список в файл

решение2

Очень круто — я никогда раньше не слышал об ADS и мне пришлось поискать, что это такое.

Я не могу поручиться за надежность вашего метода, но я вижу три способа его потенциального улучшения.

1) Обычный файл может иметь имя "$DATA". Вы можете улучшить точность вашего фильтра, используя:

findstr /el :$DATA


2) Вы теряете информацию о пути, когда используете DIR /R /Soption и сохраняете только :$DATAстроки. Вот мерзкий однострочник, который перечисляет размер файла и полный путь для всех ADS. Я перенаправляю stderr на nul, чтобы скрыть сообщения об ошибках из недоступных папок:

for /r %F in (.) do @(pushd "%F"&&(for /f "tokens=1*" %A in ('dir /r^|findstr /el :$DATA') do @echo %A %~fB)&popd)2>nul


3) ADS может быть прикреплена как к папке, так и к файлу. Предположим, что существует следующая структура папок: C:\root\child\grandchild\. Также предположим, что C:\root\childесть ADS с именем child:ads.txt. DIR /R /SКоманда выведет список ADS на следующих трех уровнях:

  • C:\rootбудет списокchild:ads.txt:$DATA

  • C:\root\childбудет список.:ads.txt:$DATA

  • C:\root\grandchildбудет список..:ads.txt:$DATA

Требуется только первый листинг. В цикле FOR /F размер %Bможно получить, используя %~zB, но это работает только для первого листинга; для двух других он расширяется до пустой строки. Это обеспечивает удобный и эффективный способ устранения нежелательных листингов.

for /r %F in (.) do @(pushd "%F"&&(for /f "tokens=1*" %A in ('dir /r^|findstr /el :$DATA') do @if .%~zB neq . echo %A %~fB)&popd)2>nul


Окончательное решение выглядит намного лучше в виде многострочного пакетного скрипта.

@echo off
for /r %%F in (.) do (
  pushd "%%F" &&(
    for /f "tokens=1*" %%A in (
      'dir /r^|findstr /el :$DATA'
    ) do if "%%~zB" neq "" echo %%~zB %%~fB
    popd
  )
)2>nul


Просто удалите %%A(или %A) из команды ECHO, если вам нужны только пути к файлам ADS без размеров файлов.

Связанный контент