Eu estou procurando obter o resultado de um comando como uma variável em um script em lotes do Windows (veja como obter o resultado de um comando no bash para o equivalente de script do bash). É preferível uma solução que funcione em um arquivo .bat, mas outras soluções comuns de script do Windows também são bem-vindas.
windows
scripting
batch-file
John Meagher
fonte
fonte
Respostas:
Se você precisar capturar toda a saída do comando, poderá usar um lote como este:
Todas as linhas de saída são armazenadas em VAR separadas por "!".
@ John: existe algum uso prático para isso? Eu acho que você deve assistir ao PowerShell ou qualquer outra linguagem de programação capaz de executar tarefas de script facilmente (Python, Perl, PHP, Ruby)
fonte
cmd
para que eu possa executá-lo lá. ... Sim, isso é tão terrível quanto parece. O Visual Studio me faz querer chorar às vezes. @ Ajedi32 Acho que você quis dizer que scripts em lote são uma relíquia horrível do passado. ;)O humilde para o comando acumulou algumas capacidades interessantes ao longo dos anos:
Observe que
"delims="
substitui o espaço padrão e os delimitadores de tabulação para que a saída do comando date seja devorada ao mesmo tempo.Para capturar a saída de várias linhas, ainda pode ser essencialmente uma linha (usando a variável lf como delimitador na variável resultante):
Para capturar uma expressão canalizada, use
^|
:fonte
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
comando diretamente na linha de comando, use um único%
. Se você o usar em um arquivo em lotes, use%%
.%
, por exemplo:for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
comando usado venha do Cygwin. Eu concordo que eu deveria ter mencionado isso.Para obter o diretório atual, você pode usar isto:
Ele está usando um arquivo temporário, portanto, não é o mais bonito, mas certamente funciona! 'CD' coloca o diretório atual em 'tmpFile', 'SET' carrega o conteúdo de tmpFile.
Aqui está uma solução para várias linhas com "array":
Mas você pode considerar mudar para outro shell mais poderoso ou criar um aplicativo para esse material. Está ampliando bastante as possibilidades dos arquivos em lote.
fonte
você precisa usar o
SET
comando com parâmetro/P
e direcionar sua saída para ele. Por exemplo, consulte http://www.ss64.com/nt/set.html . Funcionará para CMD, não tenho certeza sobre arquivos .BATDe um comentário a este post:
fonte
Exemplo para definir na variável de ambiente "V" o arquivo mais recente
em um arquivo em lotes, é necessário usar o prefixo duplo na variável de loop:
fonte
Basta usar o resultado do
FOR
comando. Por exemplo (dentro de um arquivo em lotes):Você pode usar
%%I
o valor que deseja. Assim como este:%%I
.E de antemão
%%I
não possui espaços ou caracteres CR e pode ser usado para comparações !!fonte
Se você está procurando a solução fornecida em Usando o resultado de um comando como argumento no bash?
então aqui está o código:
[Créditos] : Obrigado a todas as outras respostas e algumas pesquisas na página de comandos do Windows XP .
fonte
fonte
Gostaria de acrescentar um comentário às soluções acima:
Todas essas sintaxes funcionam perfeitamente bem se o seu comando for encontrado no caminho ou se o comando for um cmdpath SEM ESPAÇOS OU PERSONAGENS ESPECIAIS.
Mas, se você tentar usar um comando executável localizado em uma pasta cujo caminho contenha caracteres especiais, será necessário colocar o caminho do comando entre aspas duplas (") e a sintaxe FOR / F não funcionará.
Exemplos:
ou
ou
Nesse caso, a única solução que encontrei para usar um comando e armazenar seu resultado em uma variável é definir (temporariamente) o diretório padrão como o próprio comando:
O resultado está correto:
Obviamente, no exemplo acima, presumo que meu script em lote esteja localizado na mesma pasta que a do meu comando executável, para que eu possa usar a sintaxe "% ~ d0% ~ p0". Se esse não for o seu caso, você precisará encontrar uma maneira de localizar o caminho do comando e alterar o diretório padrão para o caminho.
NB: Para quem se pergunta, o exemplo de comando usado aqui (para selecionar uma pasta) é FOLDERBROWSE.EXE. Encontrei-o no site f2ko.de ( http://f2ko.de/en/cmd.php ).
Se alguém tiver uma solução melhor para esse tipo de comando acessível por um caminho complexo, ficarei muito feliz em ouvi-lo.
Gilles
fonte
CALL
. FOR / F não funciona se caminho tem espaçosCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
> funciona perfeitamente.Você pode capturar toda a saída em uma variável, mas as linhas serão separadas por um caractere de sua escolha (# no exemplo abaixo) em vez de um CR-LF real.
Segunda versão, se você precisar imprimir o conteúdo linha por linha. Isso tira vantagem do fato de que não haverá linhas de saída duplicadas de "dir / b", portanto, pode não funcionar no caso geral.
fonte
o resultado é 'TXT: hola'
fonte
Você deve usar o
for
comando, aqui está um exemplo:e você pode usar,
call :output "Command goes here"
então a saída estará na%output%
variávelNota: Se você tiver uma saída de comando que é multilinha, esta ferramenta fará
set
a saída para a última linha do seu comando de multilinha.fonte
Consulte este http://technet.microsoft.com/en-us/library/bb490982.aspx, que explica o que você pode fazer com a saída do comando.
fonte
git pull>0 set /P RESULTVAR=<0
edit: Acho que não sei como usar quebras de linha aqui ... cada comando está em sua própria linha.