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

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

例如,我想从用户那里接受一个进程ID,然后针对这个ID运行jstack,将jstack调用的结果放到一个文件中。然而,当我尝试这样做时,它不起作用。

以下是我的示例bat文件内容:

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

下面是在jstack.txt中显示的内容:

Enter ID: Terminate batch job (Y/N)?
1381417 次浏览

试试这个:

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

然后,您可以使用%id%作为另一个批处理文件(如jstack %id%)的参数。

例如:

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

我不确定这是否适用于所有版本的Windows,但在我拥有的XP机器上,我需要使用以下功能:

set /p Var1="Prompt String"

如果在报价中没有提示字符串,我将根据文本得到各种结果。

语法如下: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%

注意%VariableName%语法

变量周围的美元符号在我的Vista机器上不起作用,但是百分号可以。 还要注意,在“set”行中,在提示符和用户输入之间会出现一个尾随空格
@echo off
:start
set /p var1="Enter first number: "
pause
@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

刚刚添加了

set /p NetworkLocation= Enter name for network?


echo %NetworkLocation% >> netlist.txt

序列到我的netsh批处理作业。它现在显示我响应的位置作为样本点。我连续>>输出文件,所以我现在知道“家”,“工作”,“星巴克”等。寻找干净的空气,我可以屋檐最低使用频道,是否有5或只是所有2.4兆赫的wlan周围。

与SET不同,SETX没有文档化的/提示参数。

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

在重新启动命令提示符之前,SETX创建的变量将不可用。然而,你可以巧妙地SETX一个已经被SET的变量,即使它有相同的名字。

这在Windows 8.1 Pro中很适用:

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

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

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

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

只是为了保持变量的默认值。按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)。

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

=后面的空格非常重要。

我有一个小cmd我使用时,准备pc客户端:它调用用户输入,并重命名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

有两种可能。

  1. 你忘记在jstack调用中放入%id%

    jstack %id% > jstack.txt
    

So the whole correct batch file should be:

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

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

发生的事情是这两个错误的结果: jstack应该用你提供给它的id来调用。< / p >

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

jstack > jstack.txt

所以当你不带变量运行jstack时,它输出如下:

Terminate batch file Y/N?

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

但我怀疑你在你的批处理文件代码中有jstack %id% > jstack.txt%id(并且在问题中错误地省略了它),并且你没有输入id就按下enter。批处理程序然后返回id,现在是“Enter id:”,然后运行jstack Enter ID: > jstack.txt

Jstack本身返回输入,遇到错误并要求终止 所有这些都被写入了jstack.txt文件。< / p >

你也可以尝试使用userInput.bat,它使用html input元素。

enter image description here

这将把输入赋值为jstackId:

call userInput.bat jstackId
echo %jstackId%

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

call userInput.bat

另一种方式可能会很有趣。你可以调用一个powershell脚本,在那里你可以做任何事情,并发送数据巴赫到cmd或做其他类似的事情。

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

它更灵活(你可以用powershell同样的方式发送数据)。

所以在你的cmd中,考虑到ps脚本在C:中,写这个:

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

在你的输入中。Ps1脚本,这样写:

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