
現在、代替データ ストリーム (ADS) ファイルを表示するために使用しているコードはcmd.exe
次のとおりですdir /R
。
ただし、これにより、ADS ファイルに加えて、他のすべてのファイルがリストされます。
問題は、どのようなコマンドを使えばいいのかということですのみADS ファイルを表示します。
このコマンドはdir C:\ /r /s | findstr /r "\$DATA"
私が見つけた中で最高のものですが、その正確さにはあまり納得がいきません。他に何かありますか?
答え1
代替ストリームダンプユーティリティ (Nirsoft 製) でもこれを行うことができます。
編集:GUIアプリケーションもあります代替ストリームビュー(Nirsoftも)コマンドラインサポートがあり、例えばリストをファイルにエクスポートできる
答え2
とてもクールです。ADS についてはこれまで聞いたことがなかったので、それが何なのか調べる必要がありました。
あなたの方法がどれほど信頼できるかは保証できませんが、改善できる可能性のある 3 つの方法が考えられます。
1) 通常のファイルの名前は「$DATA」です。次のものを使用することで、フィルターの精度を向上させることができます。
findstr /el :$DATA
DIR /R /S
2)オプションを使用して行のみを保持すると、パス情報が失われます:$DATA
。以下は、すべての ADS のファイル サイズとフル パスを一覧表示する厄介な 1 行のコードです。アクセスできないフォルダーからのエラー メッセージを非表示にするために、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
コマンドは、次の 3 つのレベルで ADS を一覧表示します:
C:\root
リストアップしますchild:ads.txt:$DATA
C:\root\child
リストアップします.:ads.txt:$DATA
C:\root\grandchild
リストアップします..:ads.txt:$DATA
最初のリストのみが必要です。FOR /F ループ内では、 を使用して のサイズを%B
取得できます%~zB
が、これは最初のリストに対してのみ機能し、他の 2 つのリストに対しては空の文字列に展開されます。これにより、不要なリストを便利かつ効率的に除去できます。
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