O comando FOR não pode ver arquivos ocultos

4

Estou lutando com um dos bugs mais frustrantes que já encontrei.

Descrição do bug:

O comando for do interpretador de comandos não pode ver arquivos ocultos.

Etapas da reprodução:

  1. Crie um diretório temporário
  2. Crie alguns arquivos
  3. Atribuir uma variedade de atributos aos arquivos (incluindo ocultos)
  4. Use um comando como for %i in (*) do echo "%i"

Resultados esperados:

Todos os arquivos são processados no loop for por padrão ou por um switch.

Resultados reais:

  • Arquivos com qualquer atributo diferente de oculto são processados; arquivos marcados como ocultos são ignorados
  • Não há alternância para o comando for para permitir que ele processe arquivos ocultos

Implicações:

Não há como processar os arquivos todos a partir do prompt de comando.

Pergunta:

Como o heck pode arquivos ocultos ser processados a partir do prompt de comando ou arquivos em lote (pelo menos no Windows, se não o DOS)?

    
por Synetech 16.09.2012 / 21:06

2 respostas

4

Aqui está uma alternativa (desagradável, desagradável e não ideal) para arquivos:

for /f "tokens=* delims=" %i in ('dir /b/a-d *') do echo "%i"

E uma versão para pastas (análogo a for /d… ):

for /f "tokens=* delims=" %i in ('dir /b/ad  *') do echo "%i"

E uma versão para ambos (sem for analógico, então isso é um benefício):

for /f "tokens=* delims=" %i in ('dir /b/a   *') do echo "%i"


Versão recursiva para arquivos ( for… /r ):

for /f "tokens=* delims=" %i in ('dir /b/s/a-d *') do echo "%i"

E pastas ( for /r /d… ):

for /f "tokens=* delims=" %i in ('dir /b/s/ad  *') do echo "%i"

E ambos

for /f "tokens=* delims=" %i in ('dir /b/s/a   *') do echo "%i"



Isso funciona mais ou menos, mas definitivamente tem seus problemas (especialmente para grandes conjuntos de arquivos ou pastas). Espero que haja uma solução melhor ou a Microsoft consiga corrigir / melhorar isso em um patch.

    
por 16.09.2012 / 21:18
3

Você pode usar forfiles em vez de for .

A sintaxe é bem diferente, mas tem mais funcionalidades (por exemplo, método para acessar nativamente o nome do arquivo, a extensão, o tamanho do arquivo e o timestamp) e processa todos arquivos por padrão.

Por exemplo, em vez de

for %i in (*) do echo "%i"

você usaria

forfiles /c "cmd /c echo @file"

ou simplesmente

forfiles

desde "cmd /c echo @file" é o valor padrão para o switch de comando.

    
por 16.09.2012 / 21:49