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

时间:2009-08-03 17:59:41

标签: windows batch-file prompt

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

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

这是我的样本文件内容:

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

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

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

14 个答案:

答案 0 :(得分:379)

试试这个:

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

然后,您可以将%id%作为参数用于另一个批处理文件,例如jstack %id%

例如:

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

答案 1 :(得分:92)

语法如下:set /p variable=[string]

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

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

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

请注意%VariableName%语法

答案 2 :(得分:30)

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

set /p Var1="Prompt String"

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

答案 3 :(得分:13)

@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 

答案 4 :(得分:12)

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

=之后的空格非常重要。

答案 5 :(得分:7)

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

答案 6 :(得分:7)

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

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

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

这适用于Windows 8.1 Pro:

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

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

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

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

答案 7 :(得分:4)

我在为客户端准备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

答案 8 :(得分:3)

有两种可能性。

  1. 您忘了将%id%放入jstack来电。

    jstack %id% > jstack.txt
    
  2. 所以整个正确的批处理文件应该是:

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

    和/或2.你确实把它放在了代码中(忘了在问题中告诉我们)但是当你运行批处理文件时,你按Enter键而不是输入ID(比如说1234)。

    正在发生的是这两个错误的结果: jstack应该使用您提供的id调用。

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

    jstack > jstack.txt
    

    因此,如果您在没有变量的情况下运行jstack,则会输出以下内容:

    Terminate batch file Y/N? 
    

    您的第二个错误是您在程序问您时按Enter键而不是给出值:Enter ID:。如果此时你已经输入了一个ID,比如1234,那么%id%变量就会变成那个值,在我们的例子中是1234.但是你没有提供一个值,而是按Enter键。当你没有给变量赋值时,如果之前没有设置该变量,那么变量%id%被设置为set命令的提示!!所以现在%id%设置为Enter ID:,在您调用jstack之前,在批处理文件中请求的屏幕上回显了jstack %id% > jstack.txt

    但是我怀疑你的批处理文件代码中有%id jstack Enter ID: > jstack.txt(并且在问题中错误地省略了它),并且你输入了enter而没有输入id。批处理程序然后回显id,现在是“输入ID:”,然后运行describe('Login', () => { beforeEach(async () => { await device.reloadReactNative(); await grantAccessToUserWithValidCredentials(); }); it('A User Logs Out', async () => { // here the app is ready for you specific log out use case }); async function grantAccessToUserWithValidCredentials() { //grant it } });

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

答案 9 :(得分:2)

变量周围的美元符号在我的Vista机器上不起作用,但百分号表示。 另请注意,“设置”行上的尾随空格将显示在提示和用户输入之间。

答案 10 :(得分:1)

刚刚添加了

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

序列到我的netsh批处理作业。它现在显示我作为该样本的点的响应位置。我一直在>>我现在知道的输出文件" home"," work"," Starbucks"等等。寻找清新的空气,我可以挖掘最低的使用渠道以及是否周围有5个或仅仅是所有2.4 MHz的WLAN。

答案 11 :(得分:1)

只保留变量的默认值。按Enter键以使用最近运行的.bat:

中的默认值
@echo off
set /p Var1=<Var1.txt
set /p Var1="Enter new value ("%Var1%") "
echo %Var1%> Var1.txt

rem YourApp %Var1%

在第一次运行时,只需忽略有关缺少文件的消息和变量的初始值(或者手动创建Var1.txt)。

答案 12 :(得分:0)

您也可以尝试使用使用HTML输入元素的userInput.bat

enter image description here

这会将输入分配给值jstackId:

call userInput.bat jstackId
echo %jstackId%

这只会打印最终可以用FOR /F捕获的输入值:

call userInput.bat

答案 13 :(得分:0)

另一种可能很有趣的方式。您可以在其中调用 powershell 脚本,您几乎可以在其中执行任何操作,并将数据发送到 cmd 或使用类似的方法执行其他操作。

set var=myvar; 
call "c:\input2.cmd" %var%. 

它更灵活(您可以使用 powershell 以相同的方式发送数据)。

因此在您的 cmd 中,考虑到 ps 脚本位于 C: 中:

PowerShell.exe -ExecutionPolicy unrestricted -Command "& {. C:\Input.ps1}"

在你的 input.ps1 脚本中,这样写:

$var = Read-Host -Prompt "Your input"
Write-Host "Your var:",$var
#Do stuff with your variable