O script do DOS funciona bem em uma máquina e não em outras, por quê?

1

Por não ser tão bom no dos-script, mas ter um bom uso, encontrei aqui muitas soluções fáceis para problemas que encontro. Então recentemente eu copiei um formulário de script aqui para contar o número de arquivos em subdiretórios. Eu o modifiquei ligeiramente para se adequar ao meu propósito. Agora é como segue e funciona bem na minha área de trabalho, onde eu compus:

FOR /D %%D IN ("*") DO (
  FOR /F %%K IN ('DIR /A-D "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
    ECHO %%D: %%K
  )
)

Agora a parte estranha: no meu computador (aquele em que o script foi feito) a saída é como é esperado, em outros computadores o contador não conta e dá zero como resultado (o que é absolutamente errado).

Todas as máquinas estão executando o Windows 7 (profissional no que conta, as outras duas usam premium resp professional).

O que está acontecendo aqui e como corrigi-lo?

Obrigado!

    
por jaap 01.07.2015 / 22:04

2 respostas

0

Com a mesma abordagem

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%a in (*) do for /f "tokens=1,5" %%b in ('
        dir /a-d "%%~fa\*" 2^> nul ^| findstr /b /c:"  " ^|^| echo 0
    ') do if "%%c"=="" echo %%~fa : %%b

Isso vai

  • Para cada pasta ( for /d ), pegue uma referência e armazene-a no parâmetro %%a replaceable
  • Execute um comando dir com o caminho completo da pasta %%~fa
  • Use um canal ( | ) para filtrar a lista para recuperar apenas as linhas que começam com dois espaços (as linhas de rodapé)
  • Se nenhuma linha for encontrada (ou seja, o comando dir falhou), imprima 0
  • As linhas geradas pelo dir | findstr são manipuladas com um comando for /f . Vamos ler o primeiro token (o número de arquivos na linha adecuada) e o quinto (apenas presente na linha de rodapé com a informação dos diretórios)
  • Se o quinto elemento estiver vazio, essa linha terá informações sobre os arquivos, não sobre as pastas, assim ecoará o caminho da pasta e os arquivos dentro dele

O problema com essa abordagem é que dir | findstr é executado para cada uma das subpastas. Para uma solução mais rápida

robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs

Isso simplesmente chamará robocopy , mas em vez de copiar qualquer coisa, solicitaremos que nada seja copiado e só retorne a lista do que deve ser processado ( /nocopy /l ). Solicitamos copiar da pasta atual para a pasta atual, incluindo arquivos idênticos no processo ( /is ), processando a subpasta vazia ( /e , para incluir pastas com 0 arquivos), mas apenas processar dois níveis ( /lev:2 a pasta atual e a que está abaixo), sem gerar uma lista de arquivos ( /nfl ), nenhum cabeçalho de trabalho ( /njh ) e nenhum resumo de trabalho ( /njs )

O resultado será a mesma lista, mas com o nome da pasta e o número de arquivos nas colunas alteradas

Para manter o formato de saída original

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f "tokens=1,*" %%a in ('
        robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
    ') do echo %%~fb : %%a

Isso usará for /f para processar o comando robocopy anterior, dividindo a linha em dois tokens, o primeiro conterá o número de arquivos e será armazenado em %%a , e o segundo, o restante do arquivo. linha e será armazenado em %%b . Para cada linha na saída do comando robocopy interno, o código na cláusula do é executado: apenas echo para consolar os dois tokens na ordem inversa.

    
por 02.07.2015 / 09:05
0

Instalado ou alterado Idioma de exibição do Windows . Seu script é dependente do idioma. Por exemplo, o comando dir mostra estatísticas como Soubor(ů) em vez de File(s) em janelas tchecas.

dir |find "Files(s)" , em seguida, define %ERRORLEVEL% para 1 :

FIND will set %ERRORLEVEL% as follows:

  • 0 String found in at least one of the files;
  • 1 String not found;
  • 2 If any files in the list do not exist or if no files match a wildcard mask. An invalid switch is given.

E observe que "Arquivo (s)" é um nome de pasta válido; portanto, seu script pode mostrar

==>md "File(s)"

==>D:\bat\SU5171.bat
a b: 3
File(s): Directory
FooBar: 0
FooFoo: 4
    
por 02.07.2015 / 04:59

Tags