目前,我用来显示备用数据流(ADS)文件的代码cmd.exe
是dir /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