在Windows cmd中,如何提示用户输入并在另一个命令中使用结果?

365 windows prompt batch-file

我有一个Windows .bat文件,我想接​​受用户输入,然后使用该输入的结果作为调用其他命令的一部分.

例如,我想接受来自用户的进程ID,然后针对该ID运行jstack,将jstack调用的结果放入文件中.但是,当我尝试这个时,它不起作用.

这是我的样本bat文件内容:

@echo off
set /p id=Enter ID: 
echo %id%
jstack > jstack.txt
Run Code Online (Sandbox Code Playgroud)

这是jstack.txt中显示的内容:

Enter ID: Terminate batch job (Y/N)? 

Ins*_*oup 419

试试这个:

@echo off
set /p id="Enter ID: "
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其%id%用作另一个批处理文件的参数jstack %id%.

例如:

set /P id=Enter id: 
jstack %id% > jstack.txt
Run Code Online (Sandbox Code Playgroud)

  • 请注意"输入ID:"`末尾空格的精确度.在提示和用户答案之间给出了一个很小的空间."删除互联网?没有傻"vs"删除互联网?不傻. (4认同)
  • 有没有一种方法可以将SET命令的输出传递给NIL :,以便隐藏输入?就像您要执行以下操作一样:`set / p id =输入ID:\ r \ n set / p pw =输入Passwd:`并且不希望密码文本显示在窗口中,更不用说在窗口中显示了“ DosKey”命令缓冲区?我已经尝试了几种不同的方法,但是除了编写一些C程序来获取输入并将其分配给EnvVar之外,还没有找到一种方法来执行此操作,但是这样做很欺骗!:)我希望它可以与Windows CMD一起使用。 (2认同)
  • 如果您希望将变量保持在当前批次的本地,请使用 `SETLOCAL` 和 `ENDLOCAL`。见 https://ss64.com/nt/endlocal.html (2认同)

jay*_*den 97

语法是这样的: set /p variable=[string]

查看http://commandwindows.com/batch.htmhttp://www.robvanderwoude.com/userinput.php,了解使用不同版本的Windows操作系统批处理文件进行更深入的用户输入.

设置变量后,您可以按以下方式使用它.

@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%
Run Code Online (Sandbox Code Playgroud)

注意%VariableName%语法

  • `=`之后的空格不是必需的. (13认同)
  • 当我发布我的答案时,它看起来并不像原来的问题得到了解答.最初的问题是"你如何要求用户输入然后转变并在另一个命令中使用它?" 我的答案毫不含糊地回答了这个问题.此外,当您在Google中搜索"如何从批处理文件中获取用户输入"时,此问题在结果中排​​名第2,因此需要正确的答案,我认为这个论坛适用于此. (3认同)
  • 是的,但是不是吗? (3认同)

Dan*_*iel 31

我不确定所有版本的Windows是否都是这种情况,但是在我拥有的XP机器上,我需要使用以下内容:

set /p Var1="Prompt String"
Run Code Online (Sandbox Code Playgroud)

如果没有引号中的提示字符串,我会根据文本得到各种结果.

  • 使用这个语法来**引号,但避免*显示*它们:`set/p"var1 = Prompt String"` (6认同)

han*_*man 18

set /p choice= "Please Select one of the above options :" 
echo '%choice%'
Run Code Online (Sandbox Code Playgroud)

后面的空间=非常重要.


小智 14

@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause
Run Code Online (Sandbox Code Playgroud)

如果我得到你想要的,这很好.您也可以在其他命令中使用%input%.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
Run Code Online (Sandbox Code Playgroud)


npo*_*aka 10

您还可以尝试使用userInput.bat,它使用 html 输入元素。

在此输入图像描述

这会将输入分配给值 jstackId:

call userInput.bat jstackId
echo %jstackId%
Run Code Online (Sandbox Code Playgroud)

这只会打印输入值,最终您可以使用以下命令捕获该输入值FOR /F

call userInput.bat
Run Code Online (Sandbox Code Playgroud)

  • 优秀的解决方案。谢谢你! (2认同)

小智 8

@echo off
:start
set /p var1="Enter first number: "
pause
Run Code Online (Sandbox Code Playgroud)

  • 你为什么从`:start`开始? (2认同)

Tim*_*wan 8

SETX没有记录/提示参数,因为有SET.

如果需要提示在重新启动后仍然存在的环境变量,可以使用SETX来存储它.

在重新启动命令提示符之前,由SETX创建的变量将不可用.但是,整齐地​​,您可以SETX一个已经设置过的变量,即使它具有相同的名称.

这适用于Windows 8.1 Pro:

set /p UserInfo= "What is your name?  "
setx UserInfo "%UserInfo%"
Run Code Online (Sandbox Code Playgroud)

(现有变量周围的引号是必要的.)

此过程允许您在当前会话期间使用临时SET创建的变量,并允许您在重新启动计算机或重新启动CMD提示时重用SETX创建的变量.

(编辑正确格式化代码段落.)


小智 5

在为客户准备PC时,我使用了一个cmd:它将调用用户进行输入,然后将PC重命名为该cmd。

@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
Run Code Online (Sandbox Code Playgroud)


pas*_*ute 5

有两种可能性。

  1. 您忘记%id%jstack拨打电话。

    jstack %id% > jstack.txt
    
    Run Code Online (Sandbox Code Playgroud)

因此,整个正确的批处理文件应为:

@echo off
set /p id=Enter ID: 
echo %id%
jstack %id% > jstack.txt
Run Code Online (Sandbox Code Playgroud)

和/或2.您确实将其放入代码中(并且忘记在问题中告诉我们),但是在运行批处理文件时,您按Enter键而不是输入ID(例如1234)。

这是这两个错误的结果: jstack应该使用您提供的ID进行调用。

但是在您的情况下(根据问题中提供的代码),您没有任何变量地调用了它。你写了:

jstack > jstack.txt
Run Code Online (Sandbox Code Playgroud)

因此,当您jstack不使用任何变量运行时,它将输出以下内容:

Terminate batch file Y/N? 
Run Code Online (Sandbox Code Playgroud)

您的第二个错误是,当程序询问您:时,您按Enter而不是提供一个值 Enter ID:。如果您此时将输入一个ID,例如1234,则该%id%变量将成为该值,在我们的例子中为1234。但是您没有提供值,而是按Enter键。如果您不给变量任何值,并且如果该变量之前未设置为其他任何值,则该变量%id%将设置为set命令提示符!因此,现在%id%将其设置为Enter ID:在调用jstack之前,按批处理文件中的请求在屏幕上回显的位置。

但是我怀疑您的DID jstack %id% > jstack.txt在批处理文件代码中带有%id(并且从问题中错误地将其省略了),并且您按回车时没有输入id。然后,批处理程序回显该ID(现在为“输入ID:”),然后运行jstack Enter ID: > jstack.txt

Jstack本身回显了输入,遇到一个错误并要求终止。
所有这些都被写入了jstack.txt文件。