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)?
windows
batch-file
prompt
Nakilon
fonte
fonte
choice
queset /p
Enter ID:
um ID que você deveria fornecer. o teclado.Respostas:
Tente o seguinte:
Você pode usar
%id%
como parâmetro para outro arquivo em lotes, comojstack %id%
.Por exemplo:
fonte
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."Enter ID: "
. Dá um pequeno espaço entre a resposta rápida e a resposta do usuário.Delete the internet?No silly
vsDelete the internet? No silly
.jstack %id% > jstack.txt
SETLOCAL
eENDLOCAL
se desejar manter a variável local no lote atual. Veja ss64.com/nt/endlocal.htmlA 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.
observe a
%VariableName%
sintaxefonte
cmd.exe
shell 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?=
não é necessário.cmd
que não permite espaço?SET /P variable=[promptString]
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:
Sem a seqüência de caracteres entre aspas , recebo vários resultados, dependendo do texto.
fonte
set /p "var1=Prompt String"
set /p Var1="Prompt String "
Em seguida, quando você executa o arquivo e o usuário digita algo que você obtém emPrompt String Yes
vez dePrompt StringYes
O espaço depois
=
é muito importante.fonte
se eu conseguir o que você quer, isso funciona bem. você pode usar% input% em outros comandos também.
fonte
fonte
:start
?: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 apopd
, ou algo assim. Então, você também tem a opção de usar umIF ERRORLEVEL1 GOTO END
... ou até umGOTO ERR
, e abaixo de:err
algo como echo Ocorreu um erro ao tentar obter o número do arquivo. goto: end Provavelmente é uma questão de hábito ...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:
(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.)
fonte
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.
fonte
Existem duas possibilidades.
Você esqueceu de fazer
%id%
ajstack
ligação.Portanto, todo o arquivo em lotes correto deve ser:
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:
jstack
deve 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:
Portanto, quando você executa
jstack
sem variável, gera o seguinte: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 doset
comando !! Então agora%id%
está definido como oEnter 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.txt
có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.
fonte
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.
fonte
C:\>set /p DestPath="Type path:"
e a próxima linha éType path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
no 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. Consultecmd /?
para obter informações sobre este assunto, bem comohelp setlocal
...Acabei de adicionar o
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.
fonte
Apenas para manter um valor padrão da variável. Pressione Enter para usar o padrão da execução recente do seu .bat:
Na primeira execução, ignore a mensagem sobre falta de arquivo com o valor inicial da variável (ou crie o Var1.txt manualmente).
fonte
(set /p var=<var1.txt) 2>nul
suprimirá a mensagem de erro. Você também pode darset var1=default
em vez de começar algo de um arquivo