No cmd do Windows, como solicito a entrada do usuário e uso o resultado em outro comando?

398

Eu tenho um arquivo .bat do Windows que gostaria de aceitar a entrada do usuário e, em seguida, uso os resultados dessa entrada como parte da chamada para comandos adicionais.

Por exemplo, eu gostaria de aceitar um ID do processo do usuário e, em seguida, executar o jstack nesse ID, colocando os resultados da chamada do jstack em um arquivo. No entanto, quando eu tento isso, ele não funciona.

Aqui está o meu exemplo de conteúdo do arquivo bat:

@echo off
set /p id=Enter ID: 
echo %id%
jstack > jstack.txt

e aqui está o que aparece no jstack.txt:

Digite o ID: encerrar o trabalho em lotes (S / N)? 
Nakilon
fonte
2
"Terminar trabalho em lote (S / N)?" normalmente aparece quando você pressiona ctrl-c enquanto o seu .bat está em execução.
217 Jim Jim
2
O Jstack.txt conterá a saída do jstack e nada relacionado ao seu arquivo em lotes e você também não disse o que é o Jstack.
Sgmoore 30/07/2012
11
Nenhuma dessas respostas funcionou? Caso contrário, você encontrou uma solução? Se você fez isso, seria útil se você publicou aqui como uma resposta automática.
Maslor
11
Se você deseja opções fixas para a entrada, é melhor usar o choicequeset /p
icc97
2
Marque minha postagem como a resposta, cuja essência é que, ao executar o programa em lote, você pressiona Enter em vez de fornecer um ID no prompt e, portanto, o% id% foi definido como Enter ID: um ID que você deveria fornecer. o teclado.
Pashute

Respostas:

459

Tente o seguinte:

@echo off
set /p id="Enter ID: "

Você pode usar %id%como parâmetro para outro arquivo em lotes, como jstack %id%.

Por exemplo:

set /P id=Enter id: 
jstack %id% > jstack.txt
Instantsoup
fonte
2
Existe uma maneira de canalizar a saída do comando SET para NIL :, para que você possa ocultar a digitação? Como se você quisesse fazer um: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:e não quisesse que o texto da senha fosse exibido na janela, muito menos, aparecesse no buffer de comando "DosKey"? Eu tentei várias maneiras diferentes e não consegui encontrar uma maneira de fazer isso, além de escrever um pequeno programa C para pegar a entrada e atribuí-lo a um EnvVar, mas isso é trapaça! :) Quero que ele trabalhe apenas com os CMDs do Windows.
precisa saber é o seguinte
4
Observe a delicadeza adicional do espaço no final de "Enter ID: ". Dá um pequeno espaço entre a resposta rápida e a resposta do usuário. Delete the internet?No sillyvs Delete the internet? No silly.
Icc97
Não há necessidade de cotações. O que o @Instantsoup estava faltando era o '% id% `na linhajstack %id% > jstack.txt
pashute 14/0318
11
Use SETLOCALe ENDLOCALse desejar manter a variável local no lote atual. Veja ss64.com/nt/endlocal.html
endo64
99

A sintaxe é a seguinte: set /p variable=[string]

Confira http://commandwindows.com/batch.htm ou http://www.robvanderwoude.com/userinput.php para obter mais informações sobre a entrada do usuário com as diferentes versões dos arquivos em lotes do sistema operacional Windows.

Depois de definir sua variável, você poderá usá-la da seguinte maneira.

@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%

observe a %VariableName%sintaxe

jayfessenden
fonte
Por favor, termine sua frase ... você incluirá outro link? Além disso, testei todos os itens acima em um cmd.exeshell do Windows 7 e cada um - sem exceção - atribui entrada do usuário a uma variável nomeada arbitrariamente. Como sua resposta está embelezando o que já foi fornecido?
CHB
3
Quando publiquei minha resposta, não parecia que a pergunta original havia sido respondida. A pergunta original é "Como você solicita a entrada do usuário e, em seguida, a entrega e a utiliza em outro comando?" Eu acredito que minha resposta respondeu sucintamente à pergunta. Além disso, quando você pesquisa no Google por "como você obtém a entrada do usuário de um arquivo em lotes", esta pergunta é a nº 2 em resultados, portanto ela precisa da resposta correta, para a qual eu pensei que este fórum fosse.
Jayfessenden
14
O espaço após o =não é necessário.
Joey
Por que precisamos do espaço? O que exatamente acontece no cmdque não permite espaço?
ytpillai
@ Joey Eu concordo, a página robvanderderwoude.com não tem espaçoSET /P variable=[promptString]
icc97
31

Não tenho certeza se esse é o caso de todas as versões do Windows; no entanto, na máquina XP que tenho, preciso usar o seguinte:

set /p Var1="Prompt String"

Sem a seqüência de caracteres entre aspas , recebo vários resultados, dependendo do texto.

Daniel
fonte
+1 para "vários resultados, dependendo do texto": tive o mesmo problema. Agora, ele imprime as aspas com o texto, mas não há mais comportamento estranho.
21915 Benj
6
usar esta sintaxe para ter as aspas, mas evitar mostrando -lhes:set /p "var1=Prompt String"
Stephan
É útil usar as aspas e incluir um espaço no final, pois torna o prompt na linha de comando mais agradável. Ter as aspas torna óbvio que existe um espaço no arquivo em lotes. set /p Var1="Prompt String "Em seguida, quando você executa o arquivo e o usuário digita algo que você obtém em Prompt String Yesvez dePrompt StringYes
icc97
22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

O espaço depois =é muito importante.

hannad rehman
fonte
14
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

se eu conseguir o que você quer, isso funciona bem. você pode usar% input% em outros comandos também.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
fedeb
fonte
8
@echo off
:start
set /p var1="Enter first number: "
pause
Anisha Gupta
fonte
2
Por que você começa :start?
Benj
11
:starté apenas um marcador ... Por exemplo, ele também pode usar um :end, que faz com que coisas como limpeza de variável aconteçam, ou chamem a popd, ou algo assim. Então, você também tem a opção de usar um IF ERRORLEVEL1 GOTO END... ou até um GOTO ERR, e abaixo de :erralgo como echo Ocorreu um erro ao tentar obter o número do arquivo. goto: end Provavelmente é uma questão de hábito ...
LarryF
8

Não há parâmetro documentado / prompt para o SETX, pois existe para o SET.

Se você precisar solicitar uma variável de ambiente que sobreviverá à reinicialização, use o SETX para armazená-la.

Uma variável criada pelo SETX não será utilizável até que você reinicie o prompt de comando. No entanto, é possível ordenar SETX uma variável que já foi SET, mesmo que tenha o mesmo nome.

Isso funciona para mim no Windows 8.1 Pro:

set /p UserInfo= "What is your name?  "
setx UserInfo "%UserInfo%"

(As aspas ao redor da variável existente são necessárias.)

Este procedimento permite que você use a variável criada pelo SET temporariamente durante a sessão atual e permitirá reutilizar a variável criada pelo SETX após a reinicialização do computador ou a solicitação do CMD.

(Editado para formatar parágrafos de código corretamente.)

Timothy J. McGowan
fonte
5

Eu tenho um pouco de cmd que uso ao preparar o pc para os clientes: ele chama o usuário para entrada e renomeia o pc para isso.

@ECHO "remember to run this as admin."
@ECHO OFF
SET /P _inputname= Please enter an computername:
@ECHO Du intastede "%_inputname%"
@ECHO "The pc will restart after this"
pause
@ECHO OFF
wmic computersystem where name="%COMPUTERNAME%" call rename name="%_inputname%"

shutdown -r -f
Werdna
fonte
Oi novamente este script útil é usado em Win10 pc após a configuração inicial :-)
Werdna
5

Existem duas possibilidades.

  1. Você esqueceu de fazer %id%a jstackligação.

    jstack %id% > jstack.txt
    

Portanto, todo o arquivo em lotes correto deve ser:

@echo off
set /p id=Enter ID: 
echo %id%
jstack %id% > jstack.txt

E / ou 2. Você o inseriu no código (e esqueceu de nos dizer a pergunta), mas quando executou o arquivo em lotes, pressionou a tecla Enter em vez de digitar um ID (por exemplo, 1234).

O que está acontecendo é o resultado desses dois erros: jstackdeve ser chamado com o ID que você fornece.

Mas no seu caso (de acordo com o código que você forneceu na pergunta), você o chamou sem nenhuma variável. Você escreveu:

jstack > jstack.txt

Portanto, quando você executa jstacksem variável, gera o seguinte:

Terminate batch file Y/N? 

Seu segundo erro é que você pressionado Enter em vez de dar um valor quando o programa que você perguntou: Enter ID:. Se você inserisse um ID nesse ponto, digamos 1234, a %id%variável se tornaria esse valor, no nosso caso 1234. Mas você NÃO forneceu um valor e, em vez disso, pressionou Enter. Quando você não atribui nenhum valor à variável, e se essa variável não estava definida para mais nada antes, a variável %id%é configurada para o prompt do setcomando !! Então agora %id%está definido como o Enter ID:que foi ecoado na tela, conforme solicitado no arquivo em lotes ANTES de você chamar o jstack.

Mas suspeito que você tenha o jstack %id% > jstack.txtcódigo do arquivo em lotes com o %id(e omitido por engano da pergunta) e que você pressione enter sem digitar um ID. O programa em lote repetiu o ID, que agora é "Enter ID:", e depois executoujstack Enter ID: > jstack.txt

O próprio Jstack ecoou a entrada, encontrou um erro e pediu para terminar.
E tudo isso foi escrito no arquivo jstack.txt.

pashute
fonte
3

Os cifrões em torno da variável não funcionam na minha máquina Vista, mas os sinais de porcentagem. Observe também que um espaço à direita na linha "definida" será exibido entre o prompt e a entrada do usuário.

SRE
fonte
espaço à direita? win7 x64 rus: C:\>set /p DestPath="Type path:"e a próxima linha éType path:c:\dddd
Arioch 'The
2
O sinal $ é para variáveis ​​bash ou unix. O sinal %% é para variáveis ​​do Windows.
Noob
Se você tiver um SETLOCAL ENABLEDELAYEDEXPANSIONno arquivo em lotes, poderá !EnvVariable!expandi-lo para seu valor durante os loops FOR ou outras coisas que não expandem a macro até que a linha seja realmente processada pelo analisador Cmd. Consulte cmd /?para obter informações sobre este assunto, bem como help setlocal...
LarryF
2

Acabei de adicionar o

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

sequência ao meu trabalho em lote netsh. Agora ele mostra o local em que respondo como o ponto para essa amostra. Eu continuo >> o arquivo de saída para que eu conheça agora "casa", "trabalho", "Starbucks" etc. Procurando um ar limpo, posso ouvir os canais de menor uso e se existem 5 ou apenas todas as WLANs de 2,4 MHz disponíveis.

John
fonte
2

Apenas para manter um valor padrão da variável. Pressione Enter para usar o padrão da execução recente do seu .bat:

@echo off
set /p Var1=<Var1.txt
set /p Var1="Enter new value ("%Var1%") "
echo %Var1%> Var1.txt

rem YourApp %Var1%

Na primeira execução, ignore a mensagem sobre falta de arquivo com o valor inicial da variável (ou crie o Var1.txt manualmente).

Antoni
fonte
(set /p var=<var1.txt) 2>nulsuprimirá a mensagem de erro. Você também pode dar set var1=defaultem vez de começar algo de um arquivo
Stephan
Stephan, A segunda parte da sua proposta não preserva os valores entre as execuções !? Você pode desenvolvê-lo mais?
27617 Antoni
não, não entre as corridas. Apenas fornece um valor padrão. (não houve solicitação para armazenar o valor entre as execuções na pergunta).
Stephan