AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1749871
Accepted
acgbox
acgbox
Asked: 2022-10-28 09:33:16 +0800 CST2022-10-28 09:33:16 +0800 CST 2022-10-28 09:33:16 +0800 CST

substituir saída variável em um lote de outro lote

  • 772

O usuário digita manualmente, em uma janela, os dados de entrada, que são armazenados em variáveis. Então o lote faz um "eco" das variáveis ​​que contém os dados que o usuário digitou (first.bat):

set source=%HOMEDRIVE%\test\data.txt
mydialogbox=%HOMEDRIVE%\test\myprogram_dialogbox.exe

SetLocal EnableDelayedExpansion

:: dialog box
for /f "tokens=1-3 delims=" %%i in ('%mydialogbox% --forms --title="Dialog" --text="Set Data" --add-entry="USER" --add-entry="PASSWORD" --add-entry="DBNAME" --separator=","') do (
  set line=%%i 
  echo(!line: =!> %source%
)
IF EXIST %source% (GOTO setdata) else (GOTO end)

:setdata
FOR /F "eol=; tokens=1-3 delims=," %%A IN (%source%) DO (
    set dbuser=%%A
    set dbpass=%%B
    set dbname=%%C
)
echo your imput: %dbuser% %dbpass% %dbname%

por exemplo:

your input: mydb zuckerberg dadada

Então eu preciso substituir esses valores (destas variáveis: %dbuser% %dbpass% %dbname%) em outro script (second.bat)

set dbname=foo
set dbuser=bar
set dbpass=blabla

saída esperada (a mudança não pode ser dinâmica, mas permanente):

set dbname=mydb
set dbuser=zuckerberg
set dbpass=dadada

como faço isso?

PS: No linux isso é fácil

sed -e "s:$dbuser:zuckerberg:g" second.bat

PS: Se o que estou perguntando não funcionar, existe uma maneira de usar a saída das %dbuser% %dbpass% %dbname%variáveis ​​de first.batdentrosecond.bat

obrigado

Atualizar:

  1. Estou usando o fart-it e funcionou:

first.bat:

fart.exe second.bat "zuckerberg" "%dbuser%"
fart.exe second.bat "dadada" "%dbpass%"
fart.exe second.bat "mydb" "%dbname%"

Mas tenho que executar 3 vezes o mesmo comando para cada substituição. E gostaria de saber se existe outra solução (.bat, .cmd) que não dependa de programas externos

  1. Outra solução é colocar a saída do "echo" nas variáveis ​​em second.bat:

first.bat:

echo your imput: %dbuser% %dbpass% %dbname%

second.bat:

FOR /F "tokens=*" %%g IN ('echo %dbuser%') do (SET myuser=%%g)
etc

mas isso não substitui permanentemente os valores das variáveis ​​do segundo script (que é o que eu quero).

  1. Outra solução é esta ( first.bat):
(for /f "tokens=1* delims=:" %%a in (%source%) do (
 if "%%b"=="" (echo %%a) else (
  echo %%a|find " id" >null&& echo %%a: ||echo %%a: %%b
 )
))>second.bat

Mas não consegui ajustá-lo aos meus interesses, pois ele reescreve a saída (não pesquisa e substitui as strings)

  1. Outra solução é com replacer.bat :
call replacer.bat "second.bat" "zuckerberg" "%dbuser%"

Tem os mesmos problemas que peido-it. Eu tenho que executar um comando para cada substituição (isso não é muito otimizado para o meu código) e dependeria de um script externo

command-line
  • 4 4 respostas
  • 97 Views

4 respostas

  • Voted
  1. Narzard
    2022-10-28T13:50:36+08:002022-10-28T13:50:36+08:00

    Você pode usar a callfunção para passar as variáveis.

    %source%no seu código, farei referência como file.txtaqui.

    conteúdo do arquivo.txt :

    really,big,rabbit

    conteúdo do test1.bat :

    FOR /F "eol=; tokens=1-3 delims=," %%A IN (file.txt) DO (
        set dbuser=%%A
        set dbpass=%%B
        set dbname=%%C
    )
    call test2.bat
    

    conteúdo do test2.bat :

    @echo OFF
    echo db user is %dbuser% 
    echo db pass is %dbpass%  
    echo the dbname is %dbname%
    

    Agora, se você executar test1.batem cmd, obterá como saída:

    db user is really
    db pass is big
    the dbname is rabbit
    

    test2.bat é onde você pode colocar as variáveis ​​que precisam ser executadas como seu segundo lote para fazer algo com esses parâmetros.

    • 1
  2. Best Answer
    Vomit IT - Chunky Mess Style
    2022-10-28T15:35:41+08:002022-10-28T15:35:41+08:00

    Passar argumentos cmd de script em lote clássico ao executar o second.batdeve fazer isso sem problemas. O uso desse método elimina completamente a necessidade de alterar qualquer conteúdo de second.bat.

    Ele essencialmente torna second.batdinâmico e usa os parâmetros de argumento passados ​​como variáveis ​​que contêm os valores de espaço reservado (por exemplo %~1, %~2, etc.) para os valores de argumento passados ​​(por exemplo , "flockingbird" "clockingmerge" "wishyword").

    Segundo.bat

    SET "dbuser=%~1"
    FOR /F "tokens=*" %%g IN ('echo %dbuser%') do (SET "myuser=%%~g")
    etc
    

    Executando

    Você pode escolher qualquer método que funcione melhor para executar ou chamar o second.batscript, seja usando call, start, algo como second.bat "flockingbird"ou qualquer outra maneira que funcione para passar o valor do argumento no tempo de execução desecond.bat


    Outro exemplo

    Lote

    @echo off
    set "dbname=%~1"
    set "dbuser=%~2"
    set "dbpass=%~3"
    
    echo %dbname%
    echo %dbuser%
    echo %dbpass%
    
    pause
    

    Executar

    C:\Folder\second.bat "flockingbird" "clockingmerge" "wishyword"
    

    Resultado

    flockingbird
    clockingmerge
    wishyword
    

    Recursos de apoio

    • Parâmetros de linha de comando

      Arquivos em lote só podem manipular parâmetros %0para%9

      %0é o nome do programa como foi chamado, %1é o primeiro parâmetro da linha de comando, %2é o segundo parâmetro da linha de comando e assim por diante até %9.

    • Passar argumentos de linha de comando (parâmetros) para um arquivo de lote do Windows

      %~1 Expanda %1 removendo as aspas ao redor ("")

    • Começar

    • Ligar

      CALLum segundo arquivo de lote

      O CALLcomando iniciará um novo contexto de arquivo em lote junto com quaisquer parâmetros especificados. Quando o final do segundo arquivo de lote for atingido (ou se EXITfor usado), o controle retornará logo após a CALLinstrução inicial.

      Os argumentos podem ser passados ​​como uma string simples ou usando uma variável:

      CALL MyScript.cmd "1234" CALL OtherScript.cmd %_MyVariable%

    • 1
  3. harrymc
    2022-10-28T10:14:23+08:002022-10-28T10:14:23+08:00

    Você não pode compartilhar variáveis ​​locais entre sessões CMD.

    Você precisa usar um mecanismo global para torná-los acessíveis a partir de outra sessão, por exemplo, um arquivo comum, o registro ou as variáveis ​​do sistema (consulte o comando setx).

    • 0
  4. T3RR0R
    2022-11-01T10:32:54+08:002022-11-01T10:32:54+08:00

    Aqui está um exemplo da lógica envolvida no tratamento de uma inicialização de primeira execução. Validação adicional de dados passados ​​como argumentos pela entrada do usuário fortemente recomendada.

    @Echo off
    
    Set "var1="
    Set "var2="
    Set "var3="
    
    Rem if file called with 3 arguments
    If not "%~3" == "" (
        If not exist "%TEMP%\%~n0_firstrun.dat" (
            <nul set /p "=Initiallizing... "
            Rem assumes delayed expansion state is disabled
            Set "var1=%~1"
            Set "var2=%~2"
            Set "var3=%~3"
            >"%TEMP%\%~n0_firstrun.dat" (
                Setlocal EnableDelayedExpansion
                    Echo Set "var1=!var1!"
                    Echo Set "var2=!var2!"
                    Echo Set "var3=!var3!"
                Endlocal
                Rem optional - use conditional operator to flag write permission / filename error to calling script
            ) || (
                Echo Failed - Permission or Filename error
                exit /b 1
            )
            Rem Optional - guard initialization file from accidental user deletion
            REM Attrib +R "%TEMP%\%~n0_firstrun.dat"
            echo - Initiallization Complete
        )
    ) Else If not exist "%TEMP%\%~n0_firstrun.dat" If not "%~1" == "" If "%~3" == "" (
        Echo Initiallization Failed - Insufficient arguments provided
        Exit /B 2
    )
    cls
    Rem attempt to load the variables.
    Rem flags error in the event user has deleted the initialization file 
    (For /f "UsebackQ delims=" %%G in ("%TEMP%\%~n0_firstrun.dat")Do %%G) || (
        Rem user has deleted the initialization file
        Exit /b 2
    )
    
    Set Var
    Pause
    
    • -1

relate perguntas

  • Como posso selecionar uma linha no terminal macOS com atalhos de teclado?

  • Como posso alternar Handoff (Continuidade) no Terminal no macOS?

  • Existe um dispositivo ou executável no Windows que pode fornecer bytes aleatórios criptograficamente seguros via CMD ou Powershell?

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Não é possível ativar o Microsoft Print to PDF depois de desativado

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve