
cmd.exe
Derzeit ist der Code, den ich zum Anzeigen von Alternate Data Stream (ADS)-Dateien verwende dir /R
, .
Dies führt jedoch dazu, dass zusätzlich zu den ADS-Dateien auch alle meine anderen Dateien aufgelistet werden.
Die Frage ist - welchen Befehl soll ich verwenden, umnurADS-Dateien anzeigen.
Der Befehl dir C:\ /r /s | findstr /r "\$DATA"
ist der beste, den ich finden konnte – obwohl ich von seiner Genauigkeit nicht allzu überzeugt bin. Gibt es noch andere?
Antwort1
AltStreamDumpDas Dienstprogramm (von Nirsoft) kann dies ebenfalls.
EDIT: Es gibt auch GUI-AnwendungAlternativeStreamView(Nirsoft auch), die Befehlszeilenunterstützung haben und beispielsweise den Export der Liste in eine Datei ermöglichen
Antwort2
Sehr cool – ich hatte noch nie zuvor von ADS gehört und musste nachschlagen, was das ist.
Ich kann nicht für die Zuverlässigkeit Ihrer Methode bürgen, sehe aber drei Möglichkeiten, sie möglicherweise zu verbessern.
1) Eine normale Datei könnte "$DATA" heißen. Sie können die Genauigkeit Ihres Filters verbessern, indem Sie Folgendes verwenden:
findstr /el :$DATA
2) Sie verlieren die Pfadinformationen, wenn Sie DIR /R /S
die Option verwenden und nur die :$DATA
Zeilen behalten. Hier ist ein fieser Einzeiler, der die Dateigröße und den vollständigen Pfad für alle ADS auflistet. Ich leite stderr auf nul um, um Fehlermeldungen aus unzugänglichen Ordnern auszublenden:
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) Ein ADS kann sowohl an einen Ordner als auch an eine Datei angehängt werden. Angenommen, die folgende Ordnerstruktur existiert: C:\root\child\grandchild\
. Nehmen wir außerdem an, dass C:\root\child
es ein ADS mit dem Namen gibt child:ads.txt
. Der DIR /R /S
Befehl listet das ADS auf den folgenden drei Ebenen auf:
C:\root
wird auflistenchild:ads.txt:$DATA
C:\root\child
wird auflisten.:ads.txt:$DATA
C:\root\grandchild
wird auflisten..:ads.txt:$DATA
Nur das erste Listing ist erwünscht. Innerhalb der FOR /F-Schleife kann die Größe von %B
durch die Verwendung von ermittelt werden %~zB
, aber das funktioniert nur für das erste Listing; für die anderen beiden wird es zu einem leeren String erweitert. Dies bietet eine bequeme und effiziente Möglichkeit, die unerwünschten Listings zu eliminieren.
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
Die endgültige Lösung sieht als mehrzeiliges Batch-Skript viel besser aus
@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
Entfernen Sie einfach %%A
(oder %A
) aus dem ECHO-Befehl, wenn Sie nur die ADS-Dateipfade ohne die Dateigrößen möchten.