none
Ajuda com código .BAT - Verificar arquivos que estão faltando RRS feed

  • Pergunta

  • Olá,

    Estou tentando fazer um arquivo em bat que verifica se existem todos os arquivos ordenados em numeros dentro de uma pasta.

    EXEMPLO: 

    Se na pasta eu tivesse ...,Arquivo_048, Arquivo_049, Arquivo_051, Arquivo_052, ... ele me avisaria que falta o Arquivo_050.

    O meu problema está sendo com o fato de que quando eu tenho uma quantidade de arquivos de ordem de grandeza alta (no caso são 465 arquivos) ele não percebe a falta dos arquivos de ordem de grandeza inferior (no caso *001 ao *099), pois nesses casos ele procura como *1 e assim ele aceita, por exemplo, o Arquivo_321 como prova da existência do primeiro arquivo.
    Tem algum jeito de determinar que se eu digitar 000 eu quero obrigatoriamente que ele procure 001, com esses tres digitos, e não somente 1?

    Se não, que outra maneira eu poderia fazer isso?

    Abaixo vou colocar o codigo até agora:

    @echo off
    color 0A

    echo.
    set data=%date:/=-%
    set ftime=%time: =%
    echo Executado em: %data% %ftime% >> FALTAM.txt
    SET /P "i=inicio da contagem: "
    SET /P "f=final da contagem:  "
    SET /A f=f+1
    SET /A c=i
    SET counter=0

    :loop
    SET /A c=c+1
    IF "%f%"=="%c%" goto final
    IF NOT EXIST *%c%.* goto Falta
    GOTO loop

    :Falta
    echo -Falta o numero %c% >> FALTAM.txt
    SET /A counter=counter+1
    GOTO loop

    :final
    echo Faltam %counter% documentos >> FALTAM.txt
    echo. >> FALTAM.txt
    echo. >> FALTAM.txt
    start notepad.exe FALTAM.txt
    EXIT


    sexta-feira, 4 de janeiro de 2013 04:08

Respostas

  • Em .BAT

    @echo off
    color 0A
    
    echo.
    set data=%date:/=-%
    set ftime=%time: =%
    echo Executado em: %data% %ftime% >> FALTAM.txt
    SET /P i=inicio da contagem: 
    SET /P f=final da contagem: 
    SET /P M=Mascara Numerica(exemplo 000): 
    SET /A c=%i%
    SET counter=0
    
    ::Verifica o tamanho da mascara
    set #=%M%
    set Tamanho=0
    :loopA
    if defined # (set #=%#:~1%&set /A Tamanho += 1&goto loopA)
    echo Tamanho: %Tamanho%
    
    :loop
    	
    	IF %c% GTR %f% goto :final
    	SET NUMERO=%M%%c%
    	CALL SET NUMERO_FORMATADO=%%NUMERO:~-%Tamanho%%%
    	
    	echo Localizando *%NUMERO_FORMATADO%.* ...
    	IF NOT EXIST *%NUMERO_FORMATADO%.* (
    		echo -Falta o numero %c% >> FALTAM.txt
    		echo -Falta o numero %c%
    		SET /A counter += 1
    	)
    	SET /A c=c+1
    
    	GOTO loop
    
    
    :final
    echo Faltam %counter% documentos >> FALTAM.txt
    echo. >> FALTAM.txt
    echo. >> FALTAM.txt
    start notepad.exe FALTAM.txt


    Fábio de Paula Junior

    terça-feira, 8 de janeiro de 2013 14:54
    Moderador
  • Ola, bom pelo que entendi acho que fiz certo, ele verifica a existência dos arquivos desde 0 a 465.

    se o número for menor que 10 ele obrigatoriamente procurará pelo arquivo "Arquivo_00[número]" se for maior que 10 e menor que 100 procurará por "Arquivo_0[número]"  e se for maior que 100 procurará por "Arquivo_[número]" (tradução: Como você pediu para procurar por três caracteres os arquivos, dai sempre vai ser de "arquivo_000" até "Arquivo_465").

    @echo off & setlocal enabledelayedexpansion
    color 04 & title Written By Agamenon
    mode 42,10 & del /q "Missing.txt" 2>nul
    for /l %%a in (0 1 465) do (
        
        if %%a Lss 10 (
    	set "File=Arquivo_00%%a"
        ) else (
    	if %%a Lss 100 (
    		set "File=Arquivo_0%%a"
    	) else (
    		set "File=Arquivo_%%a"
    	)
        )
    
    	if not exist "!file!" (
    		echo Falta o arquivo !File!>>"Missing.txt"
    		set /a "num+=1"
    	)
    )
    set /a "exists=465-%num%"
    echo De 465 arquivos apenas %exists% existem ^^!
    echo.
    echo Total 465 arquivos
    echo Existem %exists%
    echo Faltam %num%
    pause>nul

    ele vai gerar o arquivo com os arquivos que não existem 

    -----------------------------------------------

    Falta o arquivo Arquivo_004

    Falta o arquivo Arquivo_127

    Falta o arquivo Arquivo_389             

    -----------------------------------------------

    Bom acho que é isso, se não for especifique ainda mais o que você quer (desculpa adiantado acho que não é isso [tem um idiota escutando a mesma música sem parar aqui na minha rua e tô ficando doido]).

    Obs - O script é um arquivo Batch então cole lá no notepad e salve como "*.bat"

    Att. Hmenon



    • Editado Agam3non quarta-feira, 9 de janeiro de 2013 02:41
    • Marcado como Resposta Fábio JrModerator quinta-feira, 10 de janeiro de 2013 09:43
    quarta-feira, 9 de janeiro de 2013 02:36
  • Scavazza,

    Inclui uma opção de extensão de arquivo, se vc não usa extensão basta deixar em branco.

    O Script foi desenvolvido em PowerShell (.ps1), basta vc modificar as duas primeiras linhas para ler o seu ambiente.

    $Pasta="C:\temp"
    $Relatorio="C:\temp\FALTAM.txt"
    
    #Limpa arquivo de saida
    Remove-Item $Relatorio -Force
    
    $i=[int] (Read-host "Inicio da contagem")
    $f=[int] (Read-host "final  da contagem")
    
    $mask=Read-Host "Máscara Numérica (Exemplo: 000)"
    
    $Prefixo=Read-Host "Prefixo do Arquivo (Exemplo: Arquivo_)"
    $extensao=Read-Host "Extensão do Arquivo (Exemplo: .txt)"
    
    
    for ($a =$i; $a -le $f; $a++) {
        #Junta mascara + numero atual do loop
        $Numero="$mask$a"
    
        #Formata numero com a quantidade de digitos da mascara
        $Numero=$Numero.substring($Numero.length - $mask.Length, $mask.Length)
     
        #Localiza arquivo
        "Testando " + (Join-Path -path $Pasta -ChildPath "$Prefixo$Numero$extensao")
        if (!(Test-Path (Join-Path -path $Pasta -ChildPath "$Prefixo$Numero$extensao"))){
            Join-Path -path $Pasta -ChildPath "$Prefixo$Numero$extensao" >> $Relatorio
        }
    
    
    }
    
    notepad $Relatorio


    Fábio de Paula Junior

    sábado, 5 de janeiro de 2013 16:46
    Moderador

Todas as Respostas

  • Scavazza,

    Inclui uma opção de extensão de arquivo, se vc não usa extensão basta deixar em branco.

    O Script foi desenvolvido em PowerShell (.ps1), basta vc modificar as duas primeiras linhas para ler o seu ambiente.

    $Pasta="C:\temp"
    $Relatorio="C:\temp\FALTAM.txt"
    
    #Limpa arquivo de saida
    Remove-Item $Relatorio -Force
    
    $i=[int] (Read-host "Inicio da contagem")
    $f=[int] (Read-host "final  da contagem")
    
    $mask=Read-Host "Máscara Numérica (Exemplo: 000)"
    
    $Prefixo=Read-Host "Prefixo do Arquivo (Exemplo: Arquivo_)"
    $extensao=Read-Host "Extensão do Arquivo (Exemplo: .txt)"
    
    
    for ($a =$i; $a -le $f; $a++) {
        #Junta mascara + numero atual do loop
        $Numero="$mask$a"
    
        #Formata numero com a quantidade de digitos da mascara
        $Numero=$Numero.substring($Numero.length - $mask.Length, $mask.Length)
     
        #Localiza arquivo
        "Testando " + (Join-Path -path $Pasta -ChildPath "$Prefixo$Numero$extensao")
        if (!(Test-Path (Join-Path -path $Pasta -ChildPath "$Prefixo$Numero$extensao"))){
            Join-Path -path $Pasta -ChildPath "$Prefixo$Numero$extensao" >> $Relatorio
        }
    
    
    }
    
    notepad $Relatorio


    Fábio de Paula Junior

    sábado, 5 de janeiro de 2013 16:46
    Moderador
  • Em .BAT

    @echo off
    color 0A
    
    echo.
    set data=%date:/=-%
    set ftime=%time: =%
    echo Executado em: %data% %ftime% >> FALTAM.txt
    SET /P i=inicio da contagem: 
    SET /P f=final da contagem: 
    SET /P M=Mascara Numerica(exemplo 000): 
    SET /A c=%i%
    SET counter=0
    
    ::Verifica o tamanho da mascara
    set #=%M%
    set Tamanho=0
    :loopA
    if defined # (set #=%#:~1%&set /A Tamanho += 1&goto loopA)
    echo Tamanho: %Tamanho%
    
    :loop
    	
    	IF %c% GTR %f% goto :final
    	SET NUMERO=%M%%c%
    	CALL SET NUMERO_FORMATADO=%%NUMERO:~-%Tamanho%%%
    	
    	echo Localizando *%NUMERO_FORMATADO%.* ...
    	IF NOT EXIST *%NUMERO_FORMATADO%.* (
    		echo -Falta o numero %c% >> FALTAM.txt
    		echo -Falta o numero %c%
    		SET /A counter += 1
    	)
    	SET /A c=c+1
    
    	GOTO loop
    
    
    :final
    echo Faltam %counter% documentos >> FALTAM.txt
    echo. >> FALTAM.txt
    echo. >> FALTAM.txt
    start notepad.exe FALTAM.txt


    Fábio de Paula Junior

    terça-feira, 8 de janeiro de 2013 14:54
    Moderador
  • Ola, bom pelo que entendi acho que fiz certo, ele verifica a existência dos arquivos desde 0 a 465.

    se o número for menor que 10 ele obrigatoriamente procurará pelo arquivo "Arquivo_00[número]" se for maior que 10 e menor que 100 procurará por "Arquivo_0[número]"  e se for maior que 100 procurará por "Arquivo_[número]" (tradução: Como você pediu para procurar por três caracteres os arquivos, dai sempre vai ser de "arquivo_000" até "Arquivo_465").

    @echo off & setlocal enabledelayedexpansion
    color 04 & title Written By Agamenon
    mode 42,10 & del /q "Missing.txt" 2>nul
    for /l %%a in (0 1 465) do (
        
        if %%a Lss 10 (
    	set "File=Arquivo_00%%a"
        ) else (
    	if %%a Lss 100 (
    		set "File=Arquivo_0%%a"
    	) else (
    		set "File=Arquivo_%%a"
    	)
        )
    
    	if not exist "!file!" (
    		echo Falta o arquivo !File!>>"Missing.txt"
    		set /a "num+=1"
    	)
    )
    set /a "exists=465-%num%"
    echo De 465 arquivos apenas %exists% existem ^^!
    echo.
    echo Total 465 arquivos
    echo Existem %exists%
    echo Faltam %num%
    pause>nul

    ele vai gerar o arquivo com os arquivos que não existem 

    -----------------------------------------------

    Falta o arquivo Arquivo_004

    Falta o arquivo Arquivo_127

    Falta o arquivo Arquivo_389             

    -----------------------------------------------

    Bom acho que é isso, se não for especifique ainda mais o que você quer (desculpa adiantado acho que não é isso [tem um idiota escutando a mesma música sem parar aqui na minha rua e tô ficando doido]).

    Obs - O script é um arquivo Batch então cole lá no notepad e salve como "*.bat"

    Att. Hmenon



    • Editado Agam3non quarta-feira, 9 de janeiro de 2013 02:41
    • Marcado como Resposta Fábio JrModerator quinta-feira, 10 de janeiro de 2013 09:43
    quarta-feira, 9 de janeiro de 2013 02:36
  • Obrigado, funcionou direitinho como eu queria.
    quarta-feira, 23 de janeiro de 2013 22:16
  • Obrigado pela ajuda.
    quarta-feira, 23 de janeiro de 2013 22:16