仅显示 ADS 文件

仅显示 ADS 文件

目前,我用来显示备用数据流(ADS)文件的代码cmd.exedir /R

但是,除了 ADS 文件之外,它还列出了我所有的其他文件。

问题是 - 我应该使用什么命令来仅有的显示 ADS 文件。


该命令dir C:\ /r /s | findstr /r "\$DATA"是我能找到的最好的命令 - 尽管我不太相信它的准确性。还有其他的吗?

答案1

AltStreamDump实用程序(来自 Nirsoft)也可以做到这一点。

编辑:还有 GUI 应用程序替代流视图(Nirsoft 也是如此)具有命令行支持并允许将列表导出到文件

答案2

非常酷——我以前从未听说过 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

%B只需要第一个列表。在 FOR /F 循环中,可以使用 来获取的大小%~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


如果您只想要 ADS 文件路径而不想要文件大小,只需从 ECHO 命令中删除%%A(或)。%A

相关内容