In Windows cmd, how do I prompt for user input and use the result in another command?
我有一个windows.bat文件,我想接受用户输入,然后使用该输入的结果作为调用其他命令的一部分。
例如,我想接受来自用户的进程ID,然后针对该ID运行jstack,将jstack调用的结果放入一个文件中。但是,当我尝试这个的时候,它不起作用。
以下是我的BAT示例文件内容:
1 2 3 4 | @echo off set /p id=Enter ID: echo %id% jstack > jstack.txt |
下面是jstack.txt中显示的内容:
1 | Enter ID: Terminate batch job (Y/N)? |
试试这个:
1 2 | @echo off set /p id="Enter ID:" |
然后,可以使用
例如:
1 2 | set /P id=Enter id: jstack %id% > jstack.txt |
语法是这样的:
查看http://commandwindows.com/batch.htm或http://www.robvanderwoude.com/userinput.php,更深入地了解不同版本的Windows OS批处理文件的用户输入。
一旦设置了变量,就可以按照以下方式使用它。
1 2 3 | @echo off set /p UserInputPath=What Directory would you like? cd C:\%UserInputPath% |
注意
我不确定这是否适用于所有版本的Windows,但是在我使用的XP计算机上,我需要使用以下内容:
1 | set /p Var1="Prompt String" |
如果没有引号中的提示字符串,我将根据文本获得各种结果。
1 2 3 4 | @echo off set /p input="Write something, it will be used in the command"echo"" echo %input% pause |
如果我得到你想要的,这个很好。您也可以在其他命令中使用%input%。
1 2 3 4 5 6 | @echo off echo Write something, it will be used in the command"echo" set /p input="" cls echo %input% pause |
1 2 | set /p choice="Please Select one of the above options :" echo '%choice%' |
对于setx没有文档/提示参数,因为对于set没有文档/提示参数。
如果需要提示输入一个在重新启动后仍能生存的环境变量,可以使用setx来存储它。
由setx创建的变量在您重新启动命令提示符之前将不可用。然而,您可以巧妙地设置一个已经设置好的变量,即使它具有相同的名称。
这在Windows 8.1 Pro中适用:
1 2 | set /p UserInfo="What is your name? " setx UserInfo"%UserInfo%" |
(现有变量周围的引号是必需的。)
此过程允许您在当前会话期间使用临时set created变量,并允许您在重新启动计算机或重新启动cmd提示时重用setx created变量。
(编辑以正确格式化代码段落。)
1 2 3 4 | @echo off :start set /p var1="Enter first number:" pause |
我在为客户准备PC时使用了一些命令:它调用用户进行输入,然后将PC重命名为输入。
1 2 3 4 5 6 7 8 9 10 | @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 |
有两种可能性。
你忘了把
1 | jstack %id% > jstack.txt |
因此,整个正确的批处理文件应该是:
1 2 3 4 | @echo off set /p id=Enter ID: echo %id% jstack %id% > jstack.txt |
和/或2。您确实把它放在代码中(忘记告诉我们这个问题),但是当您运行批处理文件时,您点击了Enter键,而不是输入一个ID(比如1234)。
这两个错误的结果是:应该使用您提供的ID来调用
但在您的情况下(根据您在问题中提供的代码),您在没有任何变量的情况下调用了它。你写道:
1 | jstack > jstack.txt |
因此,当您在没有变量的情况下运行
1 | Terminate batch file Y/N? |
第二个错误是,当程序询问您时,您按Enter键而不是给出值:
但我怀疑你的批处理文件代码中确实有
JSTACK本身对输入进行了响应,遇到了一个错误并要求终止。所有这些都被写入jstack.txt文件。
变量周围的美元符号在我的Vista机器上不起作用,但是百分比符号起作用。另外请注意,"set"行上的尾随空格将显示在提示和用户输入之间。
只保留变量的默认值。按Enter键使用.bat最近运行时的默认值:
1 2 3 4 5 6 | @echo off set /p Var1=<Var1.txt set /p Var1="Enter new value ("%Var1%")" echo %Var1%> Var1.txt rem YourApp %Var1% |
在第一次运行中,只需忽略有关缺少带有变量初始值的文件的消息(或手动创建var1.txt)。
只是添加了
1 2 3 | set /p NetworkLocation= Enter name for network? echo %NetworkLocation% >> netlist.txt |
我的netsh批处理作业的顺序。它现在向我显示了作为该样本点的响应位置。我不断地>>输出文件,所以我现在知道"家"、"工作"、"星巴克"等。为了寻找干净的空气,我可以使用最低使用率的频道,以及周围是否有5个或全部2.4兆赫无线局域网。