475

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

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

这是我的示例 bat 文件内容:

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

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

输入 ID:终止批处理作业 (Y/N)? 
4

14 回答 14

560

尝试这个:

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

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

例如:

set /P id=Enter id: 
jstack %id% > jstack.txt
于 2009-08-03T18:02:13.997 回答
117

语法是这样的: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%语法

于 2012-07-28T03:01:17.403 回答
42
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

后面的空间=很重要。

于 2017-05-19T05:50:29.970 回答
35

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

set /p Var1="Prompt String"

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

于 2011-10-03T15:56:52.147 回答
15
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

if i get what you want, this works fine. you can use %input% in other commands too.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
于 2014-06-05T17:20:21.067 回答
9

SETX 没有像 SET 那样记录在案的 /prompt 参数。

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

在您重新启动命令提示符之前,SETX 创建的变量将无法使用。然而,巧妙地,您可以对已设置的变量进行设置,即使它具有相同的名称。

这适用于 Windows 8.1 Pro:

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

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

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

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

于 2015-10-14T04:49:48.350 回答
8
@echo off
:start
set /p var1="Enter first number: "
pause
于 2014-01-29T10:09:58.020 回答
6

有两种可能性。

  1. 你忘了把 放在%id%通话中jstack

    jstack %id% > jstack.txt
    

所以整个正确的批处理文件应该是:

@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(并且在问题中错误地省略了它),并且你在没有输入 id 的情况下按了 enter。然后批处理程序回显 id,现在是“输入 ID:”,然后运行jstack Enter ID: > jstack.txt

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

于 2018-03-14T19:18:20.670 回答
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
于 2018-02-09T14:41:56.377 回答
4

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

在此处输入图像描述

这会将输入分配给值 jstackId:

call userInput.bat jstackId
echo %jstackId%

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

call userInput.bat
于 2020-11-08T23:57:57.000 回答
3

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

于 2012-07-31T15:53:45.897 回答
2

刚刚添加了

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

序列到我的 netsh 批处理作业。它现在向我显示我响应的位置作为该样本的点。我不断地>>输出文件,所以我现在知道“家”、“工作”、“星巴克”等。寻找干净的空气,我可以评估最低使用频道以及周围是否有 5 个或只有所有 2.4 MHz WLAN。

于 2015-04-13T06:26:29.063 回答
2

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

于 2017-01-25T08:54:07.427 回答
1

另一种可能很有趣的方式。您可以调用一个 powershell 脚本,您可以在其中执行几乎任何操作,并将数据 bach 发送到 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
于 2021-06-15T15:25:12.690 回答