我有一个Windows .bat文件,我想接受用户输入,然后将该输入的结果作为调用其他命令的一部分。
例如,我想从用户那里接受一个进程ID,然后运行jstack并将jstack调用的结果放入文件中。 但是,当我尝试时,它不起作用。
这是我示例bat文件的内容:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
下面是jstack.txt中显示的内容:
输入ID:终止批处理作业(Y/N)?
我有一个Windows .bat文件,我想接受用户输入,然后将该输入的结果作为调用其他命令的一部分。
例如,我想从用户那里接受一个进程ID,然后运行jstack并将jstack调用的结果放入文件中。 但是,当我尝试时,它不起作用。
这是我示例bat文件的内容:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
下面是jstack.txt中显示的内容:
输入ID:终止批处理作业(Y/N)?
尝试这样做:
@echo off
set /p "id=Enter ID: "
然后您可以将 %id%
作为参数用于另一个批处理文件,如 jstack %id%
。
例如:
set /P id=Enter id:
jstack %id% > jstack.txt
set /p id=Enter ID:\r\n set /p pw=Enter Passwd:
但是不想在窗口中显示密码文本,更不要让其显示在"DosKey"命令缓冲区中。我尝试过几种不同的方法,但是除了编写一个小的C程序来获取输入并将其赋值给EnvVar之外,我没有找到其他方法,但那样做有点作弊!:) 我希望只使用Windows CMD就能实现。 - LarryF"Enter ID: "
末尾添加的空格,可以在提示和用户回答之间增加一个可爱的小空格。Delete the internet?No silly
与Delete the internet? No silly
的区别是前者缺少空格。请注意保持原意,但使语言更通俗易懂。 - icc97SETLOCAL
和ENDLOCAL
。请参阅https://ss64.com/nt/endlocal.html。 - endo64echo hello > "%fname%"
- gogset /p variable=[string]
查看以下网站以深入了解在不同版本的Windows操作系统批处理文件中使用用户输入:http://commandwindows.com/batch.htm 或者 http://www.robvanderwoude.com/userinput.php
一旦设置了变量,你可以按照以下方式使用它。@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%
请注意%VariableName%
的语法
cmd.exe
shell 中测试了以上所有内容,并且每个命令都将用户输入分配给一个任意命名的变量,没有例外。你的回答如何添油加醋地补充了已经提供的内容? - chb=
后面的空格不是必需的。 - Joeycmd
中究竟发生了什么不允许使用空格的事情? - rassa45set /p choice= "Please Select one of the above options :"
echo '%choice%'
等号后面的空格非常重要。
我不确定这是否适用于所有版本的Windows,但在我的XP机器上,我需要使用以下内容:
set /p Var1="Prompt String"
没有引号中的提示字符串,根据文本的不同我会得到各种结果。
set /p "var1=提示字符串"
。 - Stephanset /p Var1="Prompt String "
当运行文件并且用户输入内容时,你会得到 Prompt String Yes
而不是 Prompt StringYes
。 - icc97@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
call userInput.bat jstackId
echo %jstackId%
这将只打印输入值,您最终可以通过FOR /F
捕获:
call userInput.bat
对于SETX命令而言,与SET有记录/提示参数不同的是,并没有相关文档。
如果您需要提示输入环境变量并且需要该变量可在重启后生效,可以使用SETX来存储该变量。
通过SETX创建的变量在重新启动命令提示符之前无法使用。但是请注意,即使变量名称相同,也可以将已经SET的变量用SETX重新设置。
在Windows 8.1 Pro中,这个方法适用。
set /p UserInfo= "What is your name? "
setx UserInfo "%UserInfo%"
(现有变量周围的引号是必需的。)
此过程允许您在当前会话期间使用临时SET创建的变量,并在计算机重新启动或CMD提示符重新启动时重用SETX创建的变量。
(已编辑以正确格式化代码段落。)
@echo off
:start
set /p var1="Enter first number: "
pause
:start
开始? - Benj:start
只是一个标记... 例如,他可能也会使用 :end
,这会导致变量清理等事情发生,或者调用 popd
等类似的操作。然后,您还可以选择使用 IF ERRORLEVEL1 GOTO END
... 或者 GOTO ERR
,在 :err
下面添加类似以下内容:
echo 尝试获取文件号时发生错误。
goto:end
这可能只是一种习惯... - LarryFYou forgot to put the %id%
in the jstack
call.
jstack %id% > jstack.txt
因此,整个正确的批处理文件应该是:
@echo off
set /p id=Enter ID:
echo %id%
jstack %id% > jstack.txt
并且/或者2. 你已经将它放入了代码中(但在问题中忘记告诉我们),但是当你运行批处理文件时,你按下了回车键而不是输入ID(比如1234)。
发生这种情况的原因是这两个错误: jstack
应该与您提供的ID一起调用。
但在您的情况下(根据您在问题中提供的代码),您没有使用任何变量来调用它。您写道:
jstack > jstack.txt
如果您在不使用变量的情况下运行jstack
,则会输出以下内容:
Terminate batch file Y/N?
Enter ID:
。如果你在这一步输入了ID,比如1234,那么%id%
变量将变成那个值,在我们的例子中是1234。但是你没有提供一个值,而是按下了Enter。当你不给变量任何值时,如果该变量之前没有设置为其他任何值,那么变量%id%
就会被设置为set
命令的提示信息!所以现在%id%
被设置为Enter ID:
,并在你调用jstack之前在批处理文件中请求在屏幕上显示。jstack %id% > jstack.txt
(并且在问题中不小心省略了它),然后在没有输入ID的情况下按下了Enter键。批处理程序随后回显了ID,即“Enter ID:”,然后运行了jstack Enter ID: > jstack.txt
。在我为客户准备电脑时,我有一个小的命令行程序:它调用用户输入并将计算机重命名为该名称。
@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
choice
而不是set /p
。 - icc97