В настоящее время код, который я использую для отображения файлов альтернативного потока данных (ADS) в cmd.exeis dir /R.
Тем не менее, это то, что он перечисляет все мои другие файлы, в дополнение к файлам ADS.
Вопрос в том, какую команду использовать только для отображения файлов ADS.
Команда dir C:\ /r /s | findstr /r "\$DATA"- лучшее, что я могу найти - хотя я не слишком убежден в ее точности. Любые другие?
2 ответа на вопрос
1
Greck
Утилита AltStreamDump (от Nirsoft) также может сделать это.
РЕДАКТИРОВАТЬ: Существует также приложение с графическим интерфейсом AlternateStreamView (Nirsoft тоже), которые имеют поддержку командной строки и позволяют, например, экспортировать список в файл
Любые команды, которые не требуют установки сторонних программ?
user196661 11 лет назад
0
1
dbenham
Очень круто - я никогда не слышал об ADS раньше, и мне пришлось посмотреть, что это было.
Я не могу ручаться за то, насколько надежен ваш метод, но я вижу три способа, чтобы потенциально улучшить его.
1) Обычный файл может быть назван «$ DATA». Вы можете улучшить точность вашего фильтра, используя:
findstr /el :$DATA
2) Вы теряете информацию о пути, когда используете DIR /R /Sопцию и сохраняете только :$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 без размеров файлов.
Единственная проблема заключается в том, что альтернативные потоки могут иметь любое имя, поэтому вам нужно искать имена файлов, содержащие двоеточия.
afrazier 11 лет назад
0
@afrazier - я не понимаю твоей логики. Команда DIR / R добавляет `: $ DATA` к указанному имени каждого ADS, и мое решение ищет эту точную конечную строку. Название ADS не имеет никакого отношения к результату. Например, ADS с именем `file.txt: hidden.txt` указан как` file.txt: hidden.txt: $ DATA`.
dbenham 11 лет назад
0
Имена файлов Windows не могут содержать `:`.
aphoria 11 лет назад
0
@dbenham: Извините, я думал, что $ DATA - это имя потока. В этом случае ваши сценарии выглядят просто так.
afrazier 11 лет назад
0