Questão extrair dados da saída no arquivo bat


Eu quero adicionar meu ip ao sistema / ambiente de usuário em um arquivo bat.

Este é o código do arquivo bat

curl http://httpbin.org/ip

Esta é a saída:

{
   "origin": "1.2.3.4"
}

Eu quero definir o ambiente set ip=1.2.3.4

Como devo fazer isso?


2


origem


Vendo que você marcou sua pergunta no Windows7, eu acho que você deveria considerar o uso do Powershell em vez do lote. É um shell mais moderno e poderoso nativo do Windows. - Aaron
Você acha que ps pode tornar mais ágil realizar essa tarefa? - Aminadav Glickshtein
Eu realmente não usei muito o Powershell, mas pelo que eu vi, vai desde a loucura de código dos anos 80, que é em lote até alguma API moderna de código, tentando deixar à vontade tanto os usuários bash quanto os .NET. Se você trabalhou 20 anos em lote, acho que não adianta aprender PS agora, mas menos do que isso deve ter um grande aumento na produtividade - Aaron
@Aaron Eu só tenho aprendido lote por um curto período de tempo, mas eu sei o que é fácil de alcançar. É uma linguagem muito menor, mais fácil de aprender e conhecer suas limitações e truques. - DavidPostill♦
@Aaron eu posso responder a perguntas como esta em poucos minutos. Aprender o equivalente ao powershell levaria muito mais tempo. - DavidPostill♦


Respostas:


Eu quero adicionar meu endereço IP ao ambiente do sistema / usuário em um arquivo bat.

curl http://httpbin.org/ip

Esta é a saída:

{
   "origin": "1.2.3.4"
}

Use o seguinte arquivo em lotes (test.cmd):

rem @echo off
setlocal enableDelayedExpansion
for /f "usebackq skip=1 tokens=2" %%i in (`curl http://httpbin.org/ip`) do (
  setx ip %%~i
  goto :done
  )
:done
endlocal

Notas:

  • skip=1 é usado para pular a primeira linha {.
  • goto :done é usado para pular a última linha }.
  • ~ é usado para remover as aspas do endereço IP.

Leitura Adicional

  • Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
  • para / f - Comando Loop contra os resultados de outro comando.
  • Parâmetros - Um argumento de linha de comando (ou parâmetro) é qualquer valor passado para um script em lote.
  • setx - Defina as variáveis ​​de ambiente permanentemente, o SETX pode ser usado para definir as variáveis ​​de ambiente para a máquina (HKLM) ou usuário atualmente conectado (HKCU).

6



Por que enableDelayedExpansion? - Aminadav Glickshtein
@Amina Necessário para a maioria das coisas de lote. Não tem nada a ver especificamente com isso. - Insane
Eu estava testando meu arquivo de lote com set ao invés de setx e eu tinha echo !ip! depois de set, o que exige enableDelayedExpansion. Se funcionar sem você pode removê-lo. - DavidPostill♦
Obrigado. Eu removi e mudei para set ip= - Aminadav Glickshtein
set ip= é temporário ... e permanecerá definido apenas para a duração do atual cmd Concha. Sua pergunta disse "sistema / ambiente do usuário" que eu entendi para dizer que você queria permanentemente definido. - DavidPostill♦


Isso seria o equivalente no PowerShell:

$ip = curl http://httpbin.org/ip | Select-String -Pattern "[0-9.]+" | Select Matches
Set ip $ip.Matches.Get(0).Value

2