Tudo sobre batch: Apostilas, programas, dicas e tutoriais.

20 de dez. de 2012

Autor: Hmenon do fórum Batch Satti

Bom fiz esse tópico para facilitar a vida de quem ainda tem problema com o comando "for",Para ser sincero eu também não sabia usar direito ele ate umas duas semanas atras, mais ai eu desvendei o mistério e irei compartilhar a formula secreta com vocês,bom o grande truque quando vai se aprender um comando tão complexo quanto o for está na aula experimental isso é você vendo com os seus próprios olhos o que cada complemento faz.

Obs -Usarei exemplos daqui do forum no tutorial e não estranhem se aparecer uma frase idêntica a do boss pois não da pra simplificar mais, então vamos começar.

base do comando isso é:

CÓDIGO:
For "complemento" %%variavel in (conjunto) do (ação sobre o conjunto)


Exemplos básicos desse comando

CÓDIGO:
for %%a in (Pasta1 Pasta2 Pasta3) do (md %%a)


CÓDIGO:
for %%b in (notepad.exe msnmsgr.exe ) do (taskkill -f -im %%b)


CÓDIGO:
for %%c in (File.txt File2.txt) do (del /s /f /q %%c)


Antes que você tenha essa duvida (Não importa a varável %%a %%b %%c tudo vai dar no mesmo)

Esses exemplos foi só pra dar uma pequena amostra do que este comando e capaz mais isso não e nem o começo agora vamos ver os complementos para utilização do "for".


> Opções para serem utilizadas antes dos "complementos"
[/L] - Serve para especificar um loop "for /l %%a in (1,1,100) do (echo %%a)"Exemplos + Explicação
[/D] - Serve para listar diretórios "for /d %%a in (*) do (echo %%a)" -------->Exemplos + Explicação
[/R] - E um Incremento para a opção '/d' "for /d /r %%a in (*) do (echo %%a)"Exemplos + Explicação 
[/F] - Serve como um ultilitario avançado de textos "tem muitos exemplos"

> Opções no "Conjunto" 
[""] - Especifica uma cadeia de caracteres "for /f "tokens=*" %%a in ("%Date%") do (echo %%a)" 
[' '] - Especifica um comando "for /f "tokens=*" %%a in ('type Arquvio.txt') do (echo %%a)" 
[ ] - Especifica conjunto de arquivos "for %%a in (Ola.txt Final.txt) do (del /s /f /q %%a)" 

> Complementos na opção /f 

Atenção ! Esses comandos so funcionam se estiverem acompanhados da opção '/F' & Antes de ver os "complementos" (goto teste)

[tokens] Limita visualização de camadas (goto tokens)
[delims] Especifica o caracter delimitador (goto Delims)
[skip] Especifica a quantidade de linhas para serem puladas (goto Skip)
[eol] Especifica o caractere para ser ignorado... (goto eol)
[usebackq] Muda a forma de se interpretar o conjunto (goto userbackq)
goto Sets

:teste
bom e meio dificil explicar esses complementos mais para melhor entendimento vamos precisar disso

CÓDIGO:
Linha1 Parte1 Teste1
Linha2 Parte2 Teste2
Linha3 Parte3 Teste3
Cole dentro do bloco de notas e salve como "Arquivo.txt"
obs - Quando tiver a hashtag #PodeUsar esta se referindo ao "Arquivo.txt" acima
goto:eof

:tokens
Veja você mesmo o uso desse comando
#PodeUsar

CÓDIGO:
for /f "Tokens=1" %%a in (Arquivo.txt) do (echo %%a)

O resultado disso seria

CÓDIGO:
Linha1
Linha2
Linha3

e se colocarmos

CÓDIGO:
for /f "Tokens=2" %%a in (Arquivo.txt) do (echo %%a)

o resultado seria

CÓDIGO:
Parte1
Parte2
Parte3

para que vejamos todo o conteudo do arquivo ultilizamos o caractere '*'

CÓDIGO:
for /f "Tokens=*" %%a in (Arquivo.txt) do (echo %%a)

bom podemos fazer variações na ordem de como se visualizara.

CÓDIGO:
for /f "Tokens=1,2" %%a in (Arquivo.txt) do (echo %%a %%b)
Dai isso resultaria em
CÓDIGO:
Linha1 Parte1
Linha2 Parte2
Linha3 Parte3
Percebam que no (conjunto de ação) eu coloquei "%%a" e "%%b" pois se ficasse só o "%%a" não apareceria a segunda coluna de linhas, coloquei o "%%b" por que o "B" e o numero afrente do "A", tipo se a variável fosse "%%1" ficaria "%%1" "%%2".
Poderíamos colocar

CÓDIGO:
for /f "Tokens=1,2,3" %%a in (Arquivo.txt) do (echo %%b %%a %%c)

isso acarretaria em

CÓDIGO:
Parte1 Linha1 Teste1
Parte2 Linha2 Teste2
Parte3 Linha3 Teste3
Também da pra encurtar o processo tipo você quer colocar o "tokens" de 1 a 9 envez de colocar 1,2,3... vc pode usar da seguinte maneira
CÓDIGO:
for /f "tokens=1-9" %%a in (Arquivo.txt) do( echo %%a %%b %%c ...)
então acho que já da pra sacar pra que serve este complemento né ?
goto:eof

:delims
ele especifica o caractere delimitador (entre as palavras)
exemplo:
você tem o seguinte código chamado "teste.txt"

CÓDIGO:
Linha1-Parte1-Teste1
Linha2-Parte2-Teste2
Linha3-Parte3-Teste3
E quer separar cada camada, se usar só o "tokens" não ira pegar simplesmente pelo fato de as palavras estarem uma em contato com a outra tipo você colocaria
CÓDIGO:
for /f "tokens=1,2,3" %%a in (teste.txt) do (echo %%c %%b %%a)
Iria aparecer a mesma coisa do código original,agora usando o "delims" tipo isso aqui
CÓDIGO:
for /f "tokens=1,2,3 delims=-" %%a in (Arquivo.txt) do (echo %%c %%b %%a)
acarretaria em
CÓDIGO:
Teste1 Parte1 Linha1
Teste2 Parte2 Linha2
Teste3 Parte3 Linha3
Outro exemplo que acho melhor ainda de se entender e o da data olhem
CÓDIGO:
for /f "tokens=1,2,3 delims=/" %%a in ("%date%") do (echo Ano - %%c Mes - %%b Dia - %%a)
O resultado disso seria
CÓDIGO:
Ano - 2012 Mes - 08 Dia - 10
Um detalhe importante de ser ressaltado e que o caractere delims não foi igual ao do exemplo passado eu usei o '/' por que na data ele é utilizado para separar dia més e ano '10/08/2012'
goto:eof

:skip
No comando skip usaremos a #PodeUsar 
bom ele serve para pular linhas em sequencias veja

CÓDIGO:
for /f "tokens=* skip=1" %%a in (Arquivo.txt) do (echo %%a)

o Resultado disso seria

CÓDIGO:
Linha2 Parte2 Teste2
Linha3 Parte3 Teste3

como você pode ver pulou a primeira linha
obs - ele não e assim, tipo você coloca "skip=3" não pense que ele ira pular somente a terceira linha, e sim ira pular a primeira segunda e terceira. (e simplesmente isso o skip e bem simples na verdade )
goto:eof

:eol
Diferente do 'skip' o 'eol' serve para ignorar linhas com caracteres especificados por ele e não importa se estejam em ordem ou não. olha isso na pratica.
digamos que você tenha um arquivo chamado "texto.txt" com isso dentro

CÓDIGO:
boss-head
real madrid
baby
o melhor
black
time
e quer pular somente as linhas que tenham o caractere 'b' no inicio da frase
você colocaria esse comando

CÓDIGO:
for /f "tokens=* eol=b" %%a in (texto.txt) do (echo %%a)

resultaria nisso aqui

CÓDIGO:
real madrid
o melhor
time
Não tem nada pra acrescentar sobre este complemento
goto:eof

:usebackq
Esse comando serve para interpretar o conjunto de outro modo.
exemplo:Você tem um arquivo chamado de 'Ola galera.txt' e queria visualiza-lo no for se você colocar assim

CÓDIGO:
for /f "tokens=*" %%a in ("Ola galera.txt") do (echo %%a)
O prompt interpretaria como cadeia de caracteres simplesmente por que tem as [""] e iria mostrar "Ola galera.txt" na tela e não o conteúdo do arquivo então para mudar isso usa-se o "usebackq" ficando assim o código
CÓDIGO:
for /f "tokens=* usebackq" %%a in ("Ola galera.txt") do (echo %%a)
ai sim iria mostrar o conteúdo do arquivo

Obs - Tive que colocar aspas no conjunto por que o nome tem espaço e e a mesma coisa tipo quando você copia um arquivo se contiver espaços no meio do nome tem que colocar [""].
goto:eof


:Sets
* Alguns detalhes importantes
1 - Não importa a varável %%a %%b %%c tudo vai dar no mesmo
2 - No conjunto de ações não precisa ter () eu só coloco por organização
3 - O '%%Var' só e interpretado quando e salvo como ".bat" no prompt de comando utilize o '%Var'
4 - A grande sacada do for e a parte do 'delims' e 'tokens' aprendeu isso já e 70 % concluído
5 - O for ira economizar dezenas de linhas no seu código quando você sacar ele direito
6 - Você pode ver alguns exemplos do for clicando aqui
goto End

:End
Bom com isso concluímos o tutorial tenham a total certeza que tentei ser o mais claro possível
Aos que não entenderam pode me mandar a sua duvida em uma MP e tentearei soluciona-la
Aos Mods e as membros em geral podem me falar se me equivoquei em algum argumento ou coisas do tipo
A todos um abraço de Agamenon e fiquem com DEUS.

Att. Hemnon

12 comentários:

  1. Hey.. sabe eu estava testando algumas novas TAGS do Google e vim parar aqui.. eu sou o Agamenon do texto aí em cima, fui eu que escrevi este tutorial, fiquei até feliz em ver que você postou aqui no seu BLOG, na verdade fiz ele para ajudar as pessoas a entender o "tão temido for" e tirar algumas dúvidas. E é isso aí cara quanto mais pessoas você poder atrair para a programação melhor, e se for especificamente pro Batch-Script melhor ainda.

    set "autor=RÔMULO" & REM Sucesso ao seu BLOG

    PS: Sabe fiquei realmente contente, o que me deixou mais ainda foi o %autor% ter a decência de colocar os devidos créditos à mim, muitos postariam por aí como seus e levariam toda a "glória" (sei que é só um tutorial mas a lógica é a mesma, ninguém gosta de ser plagiado e copiado). Então ao %autor% que divulgue o Batch-Script assim como eu, leve às pessoas esse novo mundo, que sem dúvida nenhuma é apaixonante.

    PS: Sabe o Batch-Satti é um ótimo fórum, sem dúvida nenhuma é o melhor daqui do brasil(quem sabe até da américa latina), aprendi muito lá e qualquer script que eu crio e posto por aí eu deixo créditos ao site e divulgo.

    Att. Hmenon

    ResponderExcluir
    Respostas

    1. Valeu pelo comentário .. foi um Ctrl+c ctrl+v rs, mas sempre que tiro algo de lá ou outro lugar coloco o autor e fonte.
      Todo conteúdo aqui disponível é encontrado na internet, só algumas coisas eu fiz...

      :vlw
      T+
      goto vlw

      Excluir
  2. Cara Daew
    Parabens pelo seu blog
    eu criei um Programa em .BAT
    Queria saber se vc pode me dar uma
    Força e divulgar ele aew
    PendriveCopy
    dai te mando o Link de videos

    ResponderExcluir
  3. Excelente, meus sinceros agradecimentos. Parabéns pela iniciativa.

    ResponderExcluir
  4. Valeu CARA PARABENS era o que estava precisando para desenvolver meu BATinho, Obrigado.

    ResponderExcluir
  5. Muito bom, esclareceu varias duvidas.

    ResponderExcluir
  6. Obrigado por compartilhar, muito bem explicado e comentado.
    Parabéns! Me ajudou muito.

    ResponderExcluir
  7. Ótimo esse ensinamento. Parabéns! Gostaria muito de uma ajuda. Quer saber como pegar um arquivo com uma extenção, ex: "txt" em uma pasta e jogar em outra. Tipo isso, mas não funcionou com txt dentro do for. só quando coloco "doc.txt". Quero localizar por extenção e enviar. for %x in (doc.txt) do cd C:\Users\PC-host\Documents | dir /s /b %x | robocopy C:\Users\PC-host\Documents\%x C:\Users\PC-host\Downloads\%x

    ResponderExcluir
  8. Alguem poderia me ajudar?

    Exemplo:

    DAC005789.JPG
    DBX46956565.JPG
    DXX78988.JPG
    DAC005789_tn.JPG
    DBX46956565_tn.JPG
    DXX78988_tn.JPG

    Preciso copiar ou mover, apenas os que tenham "_tn"

    Obrigado

    ResponderExcluir
  9. Gracias, después de tanto buscar por fin encontré una buena explicación.

    ResponderExcluir
  10. Muito bom esse tutorial, foi de grande ajuda.

    ResponderExcluir