
Atualmente, o código que estou usando para mostrar arquivos Alternate Data Stream (ADS) cmd.exe
é dir /R
.
No entanto, o que isso faz é listar todos os meus outros arquivos, além dos arquivos ADS.
A questão é: qual comando devo usar paraapenasexibir arquivos ADS.
O comando dir C:\ /r /s | findstr /r "\$DATA"
é o melhor que posso encontrar - embora não esteja muito convencido de sua precisão. Algum outro?
Responder1
AltStreamDumputilitário (da Nirsoft) também pode fazer isso.
EDIT: Também existe um aplicativo GUIAlternateStreamView(Nirsoft também) que possuem suporte de linha de comando e permitem, por exemplo, exportar lista para um arquivo
Responder2
Muito legal - eu nunca tinha ouvido falar de ADS antes e tive que pesquisar o que era.
Não posso garantir o quão confiável é o seu método, mas posso ver três maneiras de melhorá-lo potencialmente.
1) Um arquivo normal pode ser denominado "$DATA". Você pode melhorar a precisão do seu filtro usando:
findstr /el :$DATA
2) Você perde as informações do caminho ao usar DIR /R /S
a opção e mantém apenas as :$DATA
linhas. Aqui está um forro desagradável que lista o tamanho do arquivo e o caminho completo para todos os ADS. Redireciono stderr para nul para ocultar mensagens de erro de pastas inacessíveis:
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) Um ADS pode ser anexado a uma pasta e também a um arquivo. Suponha que exista a seguinte estrutura de pastas: C:\root\child\grandchild\
. Suponha também que C:\root\child
haja um ADS chamado child:ads.txt
. O DIR /R /S
comando listará os ADS nos três níveis a seguir:
C:\root
irá listarchild:ads.txt:$DATA
C:\root\child
irá listar.:ads.txt:$DATA
C:\root\grandchild
irá listar..:ads.txt:$DATA
Apenas a primeira listagem é desejada. Dentro do loop FOR /F, o tamanho de %B
pode ser obtido usando %~zB
, mas isso só funciona para a primeira listagem; ele se expande para uma string vazia para os outros dois. Isso fornece uma maneira conveniente e eficiente de eliminar listagens indesejadas.
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
A solução final parece muito melhor como um script em lote de várias linhas
@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
Simplesmente remova %%A
(ou %A
) do comando ECHO se desejar apenas os caminhos dos arquivos ADS sem os tamanhos dos arquivos.