Ir ao conteúdo

Outro (BATCH) Substituir texto em um script batch


Ir à solução Resolvido por ricardo_br,

Posts recomendados

Postado

Boa noite! Vou explicar o que eu quero tudo em um só post, pois tudo tem como tema manipulação de texto.

 

Queria deixar o texto colorido, e consegui com este script:

:: ECHO COLORIDO
:c
>%2 (set/p=.) <&1
findstr /a:%1 . %2 con &erase %2
for /f "delims=" %%a in ('cmd /k prompt $h$h ^<^&1') do echo %%a
goto >NUL 2<&1


Notei que este código possuia o comando "findstr", que até então não conhecia.
 

Então pensei: Como eu posso fazer para inserir uma barra de loading em um script batch sem ter que repetir um echo varias vezes e sem ter que apagar a tela toda ("echo 0%% [               ]" "cls" "echo 1%% [I              ]" "cls" ...) apenas alterando o mesmo texto da mesma linha para fazer a barra de progresso?

 

 

+

 

 

Isto é porque estava fazendo o meu próprio shell/terminal em batch (Utilizando "set /p comando=Digite o comando: " "if %comando% equ "teste" (goto teste)" ":teste" ...) e queria fazer comandos com sintaxes (como por exemplo "teste sintaxe1 sintaxe2"). Para isso, eu teria que pegar o texto (teste sintaxe1 sintaxe2) e remover a primeira palavra (nao posso substitur todas as palavras "teste" por "" pois se a minha sintaxe for "teste" ela sera excluida) e então remover a segunda - e então colocava a terceira sintaxe dentro de uma variavel (%sintaxe2%) - Repetiria isso varias vezes ate ter todas as variaveis que eu precisasse.

 

Teria como fazer isso ou então algo parecido?

 

 

 

 

 

 

 

 

Se puderem responder as duas dúvidas, eu iria agradecer MUUUUUITO, pois não consigo achar as respostas em lugar nenhum.

Obrigado!

Se quiserem ver uma demonstração beeeeem básica do meu shell/terminal, podem ver em felipecconde.weebly.com/batshellbase. Esta é só a versão open-source sem licenca do meu terminal - uma base para quem quiser criar um shell sem precisar ter que atribuir créditos a mim (se quiserem, baixem do meu site e editem para criar seus próprios terminais!) // Estou criando um outro projeto de terminal que também será open-source, porém será licenciado com GNU GPL 3 ou algum tipo de licenca parecida.

Postado

Sobre a parte de barra de progresso pode dar uma olhada nisso para ver se isso que você quer?

 

Sobre a parte de substituir texto eu não entendi muito bem...seria criar um array de variáveis:

 

set palavra(1)=carro

set palavra(2)=casa

set palavra(3)=mulher

set palavra(4)=linda

 

echo voce e uma %palavra(4)% %palavra(3)% que tem um %palavra(1)% e mora numa %palavra(2)% maravilhosa.

Postado
  Em 05/01/2021 às 20:05, ricardo_br disse:

Sobre a parte de barra de progresso pode dar uma olhada nisso para ver se isso que você quer?

 

Sobre a parte de substituir texto eu não entendi muito bem...seria criar um array de variáveis:

 

set palavra(1)=carro

set palavra(2)=casa

set palavra(3)=mulher

set palavra(4)=linda

 

echo voce e uma %palavra(4)% %palavra(3)% que tem um %palavra(1)% e mora numa %palavra(2)% maravilhosa.

Expandir  

valeu @ricardo_br! Vou tentar explicar melhor...
 

@echo off
:cmd
set /p cmd=Digite o comando desejado: 
if "%cmd%" equ "help" (goto help)
if "%cmd%" equ "exit" (goto exit)

:help
echo AJUDA - LISTA DE COMANDOS
echo.
echo Help - Exibe ajuda
echo Exit - Sai do programa
echo.
echo OBS: Digite "help" + "comando" para obter ajuda sobre um comando específico.
goto cmd

:exit
exit

Para poder fazer o comando "help" com uma sintaxe, eu teria que repetir ele varias vezes assim:
 

:cmd
if "%cmd%" equ "help" (goto help)
if "%cmd%" equ "help help" (goto help_help)
if "%cmd%" equ "help exit" (goto help_exit)

:help
echo Mensagem de ajuda
goto cmd

:help_help
echo Mensagem de ajuda sobre o comando "help"
goto cmd

:help_exit
echo Mensagem de ajuda sobre o comando "exit"
goto cmd

Porém, o arquivo Batch fica muito confuso e toma muito tempo ter que repetir isto várias vezes para cada comando.

Se eu quisesse criar um comando "CD", por exemplo, eu não poderia fazê-lo, pois teria que repetir o comando várias vezes para os bilhões de diretórios que o Windows tem. Isso é humanamente impossível.
Teria como eu coletar o texto da variável "%cmd%", e configurar para que quando o usuário digitar "cd <diretório>", a primeira sintáxe ser coletada e ser executado "cd <sintaxe>" em um rótulo (goto)?
TIPO ASSIM:
 

:: set /p cmd=%cd% - DIGITE O COMANDO: 
C:\Windows\System32 - DIGITE O COMANDO: cd C:\Users

:: echo NAVEGANDO ATÉ O DIRETÓRIO "%Sintaxe1%"...
:: cd %Sintaxe1%
NAVEGANDO ATÉ O DIRETÓRIO "C:\Users"...

:: set /p cmd=%cd% - DIGITE O COMANDO: 
C:\Users - DIGITE O COMANDO: cd .voltar

:: Foi detectado que a sintaxe não é um diretório, e sim a sintaxe definida para o meu comando "voltar" (.voltar)
:: echo NAVEGANDO ATÉ O DIRETÓRIO ANTERIOR...
:: cd ..
VOLTANDO AO DIRETÓRIO ANTERIOR...

:: set /p cmd=%cd% - DIGITE O COMANDO: 
C:\ - DIGITE O COMANDO: 

Tipo isso.
Se puder me ajudar eu agradeço muito!

Postado

Você quer que se a pessoa digitar um caminho qualquer "CD c:\users"

 

seja exibido: NAVEGANDO ATÉ O DIRETÓRIO "c:\users""... e depois vai para o diretório e se pessoa digitar "cd ." ou "cd .voltar" seja exibido "NAVEGANDO ATÉ O DIRETÓRIO ANTERIOR..." e vai para o diretório anterior?

 

Você sabe que o normal é digitar 2 pontos para ir para o diretório anterior? "cd .."

 

Postado
  Em 05/01/2021 às 21:54, ricardo_br disse:

Você quer que se a pessoa digitar um caminho qualquer "CD c:\users"

 

seja exibido: NAVEGANDO ATÉ O DIRETÓRIO "c:\users""... e depois vai para o diretório e se pessoa digitar "cd ." ou "cd .voltar" seja exibido "NAVEGANDO ATÉ O DIRETÓRIO ANTERIOR..." e vai para o diretório anterior?

 

Você sabe que o normal é digitar 2 pontos para ir para o diretório anterior? "cd .."

 

Expandir  

Não, eu quero que, vamos supor... Pera, vou tentar explicar de forma mais simples e objetiva.



Quero que se a variável "comando" for "diretorio voltar" ele dê um "cd ..". Quando a variável "comando" for "diretorio <caminho>", ele dê um "cd <caminho>". Entendeu? Pra isso eu precisaria manipular o texto, certo? Como eu faço isso?
Também não quero utilizar a substituição de texto (set comando=%cmd:diretorio =% && cd %comando%), pois se o caminho se chamar "diretorio", a variável em si vai ficar vazia.



PS: Quero utilizar o mesmo modelo não só para "diretorio <caminho>" (cd %caminho%), mas para outras coisas como "dizer '<texto>'" (echo %texto%).

  • Solução
Postado

Acho que agora entendi. Você pode usar um For para isso, mais para resolver alguns bugs eu recomendo tirar as aspas (") antes de passar para o for e depois colocar de volta. No caso eu substituo as apsas por por "az45" porque dificilmente alguém vai usar "az45" em um comando:

 

:: Pega comando do usuáro:
set /p "cmd=%cd% - DIGITE O COMANDO: "

:: Se cmd for definida troca (") por (az45):
IF /i Defined cmd set "cmd=%cmd:"=az45%"

:: Salva o primeiro comando do usuário em Sintaxe1 e tudo que vir depois em Sintaxe2
:: Ex: Se usuário digitar "CD voltar" Sintaxe1=CD Sintaxe2=voltar
for /f "tokens=1*" %%a in ("%cmd%") do set "Sintaxe1=%%a"& set "Sintaxe2=%%b"

:: Troca (az45) por (") para o comando ficar igual tava antes
IF Defined Sintaxe1 set "Sintaxe1=%Sintaxe1:az45="%"
IF Defined Sintaxe2 set "Sintaxe2=%Sintaxe2:az45="%"

 

Se o usuário digitar: xcopy /i /h /s "Minha Pasta" "Coisas"

Sintaxe1=xcopy

Sintaxe2=/i /h /s "Minha Pasta" "Coisas"

 

1kRPU0k.png

 

 

Ai você poderia usar algo como:

 

IF /i [%Sintaxe1%]==[cd] IF /i [%Sintaxe2%]==[voltar] CD ..

 

Se o primeiro parâmetro for "CD" e o segundo "voltar" então executa comando: cd ..

 

Aqui tem um código exemplo que eu fiz baseado nos dados que você me passou:

* P.S: Para os acentos em português funcionarem salve como tipo "Ansi" não "UTF-8"

 

@echo off
chcp 1252 > nul
SetLocal EnableDelayedExpansion
:Comando
set Sintaxe1=
set Sintaxe2=
set cmd=
cls
echo.

set /p "cmd=%cd% - DIGITE O COMANDO: "
IF /i Defined cmd set "cmd=%cmd:"=az45%"

for /f "tokens=1*" %%a in ("%cmd%") do set "Sintaxe1=%%a"& set "Sintaxe2=%%b"

IF /i [%Sintaxe1%]==[CD] goto :CD
IF /i [%Sintaxe1%]==[CD..] goto :CD

IF /i [%Sintaxe1%]==[help] IF Not Defined Sintaxe2 goto :Help

IF Defined Sintaxe1 set "Sintaxe1=%Sintaxe1:az45="%"
IF Defined Sintaxe2 set "Sintaxe2=%Sintaxe2:az45="%"

%Sintaxe1% %Sintaxe2%
echo.
pause
goto :Comando

:CD 
IF /i Exist %Sintaxe2% IF /i "%Sintaxe2%"==".." (goto :Ponto) else (goto :Normal)

IF /i [%Sintaxe1%]==[cd..] goto :Ponto
IF /i [%Sintaxe2%]==[voltar] goto :Ponto
IF NOT Defined Sintaxe2 (%Sintaxe1%&echo.&pause&goto :Comando)
IF /i Not Exist %Sintaxe2% goto :ErroNaoExiste
goto :Comando
                                                                                               
:Normal
echo NAVEGANDO ATÉ O DIRETÓRIO "%Sintaxe2%"... 
cd /d %Sintaxe2%
timeout /t 3 > nul
goto :Comando

:Ponto
echo NAVEGANDO ATÉ O DIRETÓRIO ANTERIOR...
cd /d ..
timeout /t 3 > nul
goto :Comando

:Help
echo AJUDA - LISTA DE COMANDOS
echo.
echo Help - Exibe ajuda
echo Exit - Sai do programa
echo.
echo OBS: Digite "help" + "comando" para obter ajuda sobre um comando específico.
echo.
pause
goto :Comando

:ErroNaoExiste
echo ERRO^^! O CAMINHO ESPECIFICADO NÃO EXISTE...
timeout /t 3 > nul
goto :Comando

 

uYG4fdB.gif

 

Postado

@ricardo_br Obrigado pela resposta!
Eu não consegui entender a lógica deste código. Eu acabei por utilizar este que consegui achar depois de uma boa pesquisa:
 

:s
set /a cmdstxnum=%cmdstxnum%+1
set cmdstx%cmdstxnum%=%1
goto >NUL 2<&1

set /p cmd=%cd% - DIGITE O COMANDO: 

set /a cmdstxnum=0
for %%i in (%cmd%) do call:s %%i %cmdstxnum%
set cmdstx%cmdstxnum%=

Mas aí que tá um problema desse código...:

 

Vamos supor que eu digitasse "navegar c:\windows"

 

Se eu quisesse definir um "cd", teria que colocar "cd %cmdstx2%", certo?
Daí ele me daria a sintaxe "c:\windows" e executaria o comando "cd c:\windows". Até aí tudo bem...
Mas...
E se o meu diretório contivesse espaços, como por exemplo "c:\program files"?
Ele me daria sintaxe "c:\program" e executaria o comando "cd c:\program" - e eu quero que ele execute "cd c:\program files".


Eu poderia tentar utilizar o seu código que separa tudo em somente duas sintaxes, porém, e se eu quisesse definir um comando com argumentos?

Por exemplo:

cd c:\program files -explorer
cd c:\program files -copy c:\users\exemplo\desktop\backup -replaceall
computer off -force -time 50s -message Esta é uma menasagem

(Para isso eu talvez teria que detectar os hífens também, não sei.)

 

Eu também teria que achar alguma maneira de limpar todas as variaveis de sintaxe, pois senão depois do primeiro comando tudo iria se embaralhar.

Postado

Não sei se entendi o código que eu te passei salva o primeiro parâmetro na variável Sintaxe1 e o restante em Sintaxe2 se quisesse adicionar argumentos não é só adicionar ao final:

 

Ex: Pessoa digita cd "c:\Program Files"

Sintaxe1=cd

Sintaxe2="c:\Program Files"

 

Ai se você quiser adicionar mais parametros:

 

%Sintaxe1% "%Sintaxe2%" -copy c:\users\exemplo\desktop\backup -replaceall

Ficaria:

cd "c:\Program Files" -copy c:\users\exemplo\desktop\backup -replaceall

Postado

@ricardo_br Ahh, agora entendi o código.
Mas o que eu to querendo dizer é isso:

 

Você disse que...

  Citação

Ai se você quiser adicionar mais parametros:

 

%Sintaxe1% "%Sintaxe2%" -copy c:\users\exemplo\desktop\backup -replaceall

Ficaria:

cd "c:\Program Files" -copy c:\users\exemplo\desktop\backup -replaceall

Expandir  

Mas os parâmetros eu teria que adicionar na própria variável "cmd" em si, então o "-copy c:\users\exemplo\desktop\backup -replaceall" faria parte da %Sintaxe2%. Entende?

 

Esse "-copy" que eu te disse é só um exemplo - o "-copy" seria um argumento que seria criado por mim.

Exemplo:

 

:: Executa copy "c:\program files" "c:\windows\teste"
C:\Users\Exemplo\Desktop\terminal.bat - DIGITE O COMANDO: diretorio c:\program files -ricardobr c:\windows\teste
EXECUTANDO UTILITÁRIO DE CÓPIA "RICARDOBR" - COPIANDO "C:\PROGRAM FILES" PARA "C:\WINDOWS\TESTE".


:: Executa cd c:\windows\teste
C:\Users\Exemplo\Desktop\terminal.bat - DIGITE O COMANDO: diretorio c:\windows\teste
NAVEGANDO ATÉ "C:\WINDOWS\TESTE"...


:: Executa "dir"
c:\Windows\Teste - DIGITE O COMANDO: diretorio -listar
LISTANDO ARQUIVOS...

:: E por aí vai...


Daí eu definiria argumentos personalizados.

Postado

Update: Consegui resolver fazendo alguns ajustes e usando outro código também.
Minha adaptação com esse código foi mais ou menos isso:

for /f "tokens=1*" %%a in ("%cmd%") do set "Sintaxe1=%%a"& set "DepoisDaSintaxe1=%%b"
for /f "tokens=2*" %%a in ("%cmd%") do set "Sintaxe2=%%a"& set "DepoisDaSintaxe2=%%b"
for /f "tokens=3*" %%a in ("%cmd%") do set "Sintaxe3=%%a"& set "DepoisDaSintaxe3=%%b"
for /f "tokens=4*" %%a in ("%cmd%") do set "Sintaxe4=%%a"& set "DepoisDaSintaxe4=%%b"

Então se %cmd% fosse igual á: "valeu o ricardo_br é ***** :o", me seria retornado:


%Sintaxe1%: valeu
%Sintaxe2%: o
%Sintaxe3%: ricardo_br
%Sintaxe4%: é

%DepoisDaSintaxe1%: o ricardo_br é ***** :o
%DepoisDaSintaxe2%: ricardo_br é ***** :o
%DepoisDaSintaxe3%: é ***** :o
%DepoisDaSintaxe4%: ***** :o

Percebe-se que eu precisaria criar algum tipo de loop para criar mais variáveis e resetá-las depois (por exemplo, não tenho variáveis que retornassem "*****" e ":o" individualmente | Mas não acho que irei precisar de algo do tipo no futuro, esse código já faz o que eu precisava!

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...