关于批处理文件:在Windows cmd中,如何提示用户输入并在另一个命令中使用结果?

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:"

然后,可以使用%id%作为其他批处理文件(如jstack %id%的参数。

例如:

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


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

查看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%

注意%VariableName%语法


我不确定这是否适用于所有版本的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


有两种可能性。

  • 你忘了把%id%放在jstack电话里。

    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来调用jstack

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

    1
    jstack > jstack.txt

    因此,当您在没有变量的情况下运行jstack时,它会输出以下内容:

    1
    Terminate batch file Y/N?

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

    但我怀疑你的批处理文件代码中确实有jstack %id% > jstack.txt%id的代码(在问题中错误地省略了它),而且你点击enter而不输入ID。批处理程序随后回送ID,即现在的"enter id:",然后运行jstack Enter ID: > jstack.txt

    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兆赫无线局域网。