
目前,我用來顯示備用資料流 (ADS) 檔案的程式碼cmd.exe
是dir /R
.
然而,它的作用是除了 ADS 文件之外,它還列出了我的所有其他文件。
問題是 - 我應該使用什麼命令僅有的顯示 ADS 檔。
該命令dir C:\ /r /s | findstr /r "\$DATA"
是我能找到的最好的命令 - 儘管我不太相信它的準確性。還有其他人嗎?
答案1
答案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
只需要第一個列表。在 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
如果您只需要 ADS 檔案路徑而不需要檔案大小,只需從 ECHO 命令中刪除%%A
(或) 即可。%A