Windows cmd에서 사용자 입력을 요청하고 다른 명령에서 결과를 사용하려면 어떻게합니까?


397

사용자 입력을 수락하고 추가 명령 호출의 일부로 해당 입력 결과를 사용하려는 Windows .bat 파일이 있습니다.

예를 들어, 사용자로부터 프로세스 ID를 수락 한 다음 해당 ID에 대해 jstack을 실행하여 jstack 호출의 결과를 파일에 넣습니다. 그러나 이것을 시도하면 작동하지 않습니다.

다음은 샘플 박쥐 파일 내용입니다.

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

jstack.txt에 표시되는 내용은 다음과 같습니다.

ID 입력 : 일괄 작업 종료 (Y / N)? 

2
"배치 작업을 종료 하시겠습니까 (Y / N)?" 일반적으로 .bat가 실행되는 동안 ctrl-c를 누르면 나타납니다.
Jim Buck

2
Jstack.txt는 jstack 의 출력 을 포함하고 배치 파일과 관련이 없으며 Jstack이 무엇인지 말하지 않았습니다.
sgmoore

1
이 답변들 중 어느 것도 효과가 없었습니까? 그렇지 않은 경우 해결책을 찾았습니까? 직접 작성했다면 여기에 자체 답변으로 게시하면 도움이됩니다.
Maslor

1
입력에 대한 고정 옵션을 원한다면choiceset /p
icc97

2
내 게시물을 답으로 표시하십시오. 본질은 배치 프로그램을 실행할 때 프롬프트에서 ID를 제공하는 대신 Enter 키를 누르기 때문에 제공하려는 Enter ID: 일부 ID 가 아닌 % id %이 (가) 설정 되었다는 것입니다 키보드.
pashute

답변:


458

이 시도:

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

그런 %id%다음와 같은 다른 배치 파일에 매개 변수로 사용할 수 있습니다 jstack %id%.

예를 들면 다음과 같습니다.

set /P id=Enter id: 
jstack %id% > jstack.txt

2
SET 명령의 출력을 NIL :로 파이프하는 방법이 있습니까? 그래서 입력을 숨길 수 있습니까? set /p id=Enter ID:\r\n set /p pw=Enter Passwd:": DosKey"명령 버퍼에 암호 텍스트가 창에 표시되지 않게하려면 다음 과 같이하십시오 . 몇 가지 다른 방법을 시도했지만 입력을 위해 작은 C 프로그램을 작성하고 EnvVar에 할당하는 것 외에는이 작업을 수행 할 수있는 방법을 찾지 못했습니다. :) JUST Windows CMD와 함께 작동하고 싶습니다.
LarryF


4
끝에 공백이 추가 된 것에 주목하십시오 "Enter ID: ". 프롬프트와 사용자 응답 사이에 약간의 공간이 있습니다. Delete the internet?No sillyDelete the internet? No silly.
icc97

따옴표가 필요 없습니다. @Instantsoup에서 빠진 것은 줄의 '% id %'입니다jstack %id% > jstack.txt
pashute

1
변수를 현재 배치에 대해 로컬로 유지 하려면 SETLOCAL및을 사용하십시오 ENDLOCAL.
endo64

99

구문은 다음과 같습니다. set /p variable=[string]

확인 http://commandwindows.com/batch.htm 또는 http://www.robvanderwoude.com/userinput.php를 윈도우 OS의 배치 파일의 서로 다른 버전의 사용자 입력에 더 깊이 잠수.

변수를 설정하면 다음과 같은 방식으로 변수를 사용할 수 있습니다.

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

%VariableName%구문에 주목


문장을 완성하십시오 ... 다른 링크를 포함 하시겠습니까? 또한 Windows 7 cmd.exe셸 에서 위의 모든 사항을 테스트 했으며 각 예외는 예외없이 사용자 입력을 임의로 명명 된 변수에 할당합니다. 이미 제공된 내용에 대한 귀하의 답변은 어떻게 전달됩니까?
chb

3
내 답변을 게시했을 때 원래 질문에 답변 된 것처럼 보이지 않았습니다. 원래 질문은 "어떻게 사용자 입력을 요청한 후 처리하고 다른 명령에서 사용합니까?"입니다. 나는 내 대답이 간결하게 질문에 대답했다고 믿습니다. 또한 Google에서 "일괄 파일에서 사용자 입력을 얻는 방법"을 검색 할 때이 질문의 결과는 # 2이므로이 포럼의 목적이 맞는 정답이 필요합니다.
jayfessenden

14
뒤에 공백 =이 필요하지 않습니다.
Joey

왜 공간이 필요한가요? cmd공간을 허용하지 않는 정확히 무슨 일이 있습니까?
ytpillai

@Joey 동의합니다, robvanderderwoude.com 페이지 는 공간이 없습니다SET /P variable=[promptString]
icc97

31

이것이 모든 버전의 Windows에 해당되는지 확실하지 않지만 XP 시스템에서는 다음을 사용해야합니다.

set /p Var1="Prompt String"

quotes에 프롬프트 문자열이 없으면 텍스트에 따라 다양한 결과가 나타납니다.


"텍스트에 따라 다양한 결과"에 대해 +1 : 같은 문제가 있습니다. 이제 텍스트와 함께 따옴표를 인쇄하지만 더 이상 이상한 동작은 없습니다.
Benj

6
이 구문을 사용하여 따옴표를, 그러나 피할 보여주는 그들을 :set /p "var1=Prompt String"
스테판

따옴표를 사용하고 끝에 공백을 포함하면 명령 줄의 프롬프트가 더 좋을 때 유용합니다. 따옴표가 있으면 배치 파일에 공간이 있다는 것이 분명합니다. set /p Var1="Prompt String "그런 다음 파일을 실행하고 사용자가 Prompt String Yes대신 무언가를 입력하면Prompt StringYes
icc97

22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

이후의 공간 =은 매우 중요합니다.


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

원하는 것을 얻으면 정상적으로 작동합니다. 다른 명령에서도 % input %을 사용할 수 있습니다.

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

8
@echo off
:start
set /p var1="Enter first number: "
pause

2
왜 시작 :start합니까?
Benj

1
:start예를 들어, 그는 :end변수 정리와 같은 일을 일으키거나을 호출하는 등의 popd일을 할 수도 있습니다. 그런 다음 IF ERRORLEVEL1 GOTO END... 또는 심지어 를 사용하는 옵션 도 있으며 GOTO ERR, :err파일 번호를 가져 오는 중에 오류가 발생했습니다. goto : end 아마 습관의 교인 일 것입니다.
LarryF

8

SET와 마찬가지로 SETX에 대해 문서화 된 / prompt 매개 변수가 없습니다.

재부팅 후에도 지속될 환경 변수를 묻는 메시지가 표시되면 SETX를 사용하여 저장할 수 있습니다.

SETX로 만든 변수는 명령 프롬프트를 다시 시작할 때까지 사용할 수 없습니다. 그러나 이름이 같은 경우에도 이미 SET 된 변수를 SETX 할 수 있습니다.

이것은 Windows 8.1 Pro에서 작동합니다.

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

(기존 변수 주위에 따옴표가 필요합니다.)

이 절차를 통해 현재 세션 중에 임시 SET 작성 변수를 사용할 수 있으며 컴퓨터를 재부팅하거나 CMD 프롬프트를 다시 시작할 때 SETX 작성 변수를 재사용 할 수 있습니다.

(코드 단락의 형식을 올바르게 지정하도록 편집되었습니다.)


5

클라이언트에게 pc를 준비 할 때 사용하는 작은 cmd가 있습니다. 사용자에게 입력을 요청하고 pc의 이름을 바꿉니다.

@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

다시 한번이 유용한 스크립트는 초기 설정 후 Win10 PC에서 사용됩니다 :-)
Werdna

5

두 가지 가능성이 있습니다.

  1. 당신 %id%jstack전화 에 넣어 잊어 버렸습니다 .

    jstack %id% > jstack.txt
    

따라서 전체 배치 파일은 다음과 같아야합니다.

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

그리고 / 또는 2. 코드에 코드를 넣었고 (질문에서 우리에게 말을 잊어 버렸습니다) 배치 파일을 실행할 때 ID를 입력하는 대신 Enter 키를 누르십시오 (1234).

무슨 일이 일어나고 있는지는이 두 가지 실수의 결과입니다 jstack. 제공 한 ID로 호출되어야합니다.

그러나 귀하의 경우 (질문에 제공 한 코드에 따라) 변수없이 호출했습니다. 당신은 썼다 :

jstack > jstack.txt

따라서 jstack변수없이 실행 하면 다음이 출력됩니다.

Terminate batch file Y/N? 

두 번째 실수는 프로그램이 다음과 같은 질문을 할 때 값을 제공하는 대신 Enter를 눌렀다는 것 Enter ID:입니다. 이 시점에서 ID (예 : 1234)를 입력 한 경우 %id%변수는 해당 값이됩니다 (우리의 경우 1234). 그러나 값을 제공하지 않고 대신 Enter를 누르십시오. 변수에 값을 지정하지 않고 해당 변수가 이전에 다른 것으로 설정되지 않은 경우 변수는 명령 %id%의 프롬프트로 설정됩니다 set!! 이제 jstack을 호출하기 전에 배치 파일에서 요청한대로 화면에 에코되는 %id%것이 설정되었습니다 Enter ID:.

그러나 jstack %id% > jstack.txt배치 파일 코드에 DID가 있고 %id(질문에서 실수로 생략 했음 ) ID를 입력하지 않고 Enter 키를 누른 것으로 생각합니다. 그런 다음 일괄 처리 프로그램에서 ID를 에코 (이제 "Enter ID :") 한 다음 실행했습니다.jstack Enter ID: > jstack.txt

Jstack 자체가 입력을 반향하고 실수가 발생하여 종료를 요청했습니다.
그리고이 모든 것이 jstack.txt 파일에 작성되었습니다.


3

변수 주위의 달러 기호는 Vista 컴퓨터에서 작동하지 않지만 백분율 기호는 작동합니다. 또한 "set"줄의 끝에 공백이 프롬프트와 사용자 입력 사이에 나타납니다.


후행 공간? win7 x64 rus : C:\>set /p DestPath="Type path:"그리고 다음 줄은Type path:c:\dddd
Arioch 'The

2
$ 부호는 bash 또는 유닉스 변수입니다. %% 부호는 Windows 변수 용입니다.
noob

당신이있는 경우 SETLOCAL ENABLEDELAYEDEXPANSION배치 파일에서, 당신이 사용할 수있는 !EnvVariable!루프, 또는 라인이 실제로 Cmd를 파서에 의해 처리 될 때까지 매크로의 확장하지 않는 다른 것들에 대한시의 값으로 확장합니다. 이에 cmd /?대한 정보는 다음을 참조하십시오 help setlocal.
LarryF

2

방금 추가

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

내 netsh 배치 작업 순서. 이제 샘플의 포인트로 반응하는 위치를 보여줍니다. 나는 지속적으로 >> 출력 파일을 알고 있으므로 이제 "홈", "작업", "스타 벅스"등을 알 수 있습니다. 맑은 공기를 찾고, 가장 낮은 사용 채널과 5 개 또는 모든 2.4MHz WLAN이 있는지 여부를 알 수 있습니다.


2

변수의 기본값을 유지하십시오. 최근 .bat 실행에서 기본값을 사용하려면 Enter를 누르십시오.

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

rem YourApp %Var1%

첫 번째 실행에서 변수의 초기 값을 가진 파일 부족에 대한 메시지를 무시하십시오 (또는 Var1.txt를 수동으로 작성하십시오).


(set /p var=<var1.txt) 2>nul오류 메시지를 무시합니다. set var1=default파일에서 무언가를 얻는 대신 줄 수도 있습니다
Stephan

Stephan, 제안서의 두 번째 부분은 런 사이의 값을 보존하지 않습니다!? 더 발전시킬 수 있습니까?
Antoni

아니, 달리기 사이가 아닙니다. 그냥 기본값을 제공합니다. (문제의 실행 사이에 값을 저장하라는 요청이 없었습니다).
Stephan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.