在 Windows cmd 中,如何提示用户输入并在另一个命令中使用结果?
Posted
技术标签:
【中文标题】在 Windows cmd 中,如何提示用户输入并在另一个命令中使用结果?【英文标题】:In Windows cmd, how do I prompt for user input and use the result in another command? 【发布时间】:2010-11-16 11:03:05 【问题描述】:我有一个 Windows .bat 文件,我想接受用户输入,然后将该输入的结果用作调用其他命令的一部分。
例如,我想接受来自用户的进程 ID,然后针对该 ID 运行 jstack,将 jstack 调用的结果放入文件中。但是,当我尝试这个时,它不起作用。
这是我的示例 bat 文件内容:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
这是 jstack.txt 中显示的内容:
输入 ID:终止批处理作业 (Y/N)?【问题讨论】:
"终止批处理作业 (Y/N)?"通常在 .bat 运行时按 ctrl-c 时显示。 Jstack.txt 将包含来自 jstack 的 输出 并且与您的批处理文件无关,而且您还没有说 Jstack 是什么。 这些答案都不起作用吗?如果没有,您找到解决方案了吗?如果你这样做了,如果你把它发布在这里作为自我回答会很有帮助。 如果你想要输入的固定选项,你最好使用choice
而不是set /p
请将我的帖子标记为答案,其本质是在运行批处理程序时您按Enter而不是在提示符处提供ID,因此将%id%设置为@987654325 @ 而不是您应该从键盘提供的某个 ID。
【参考方案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
【讨论】:
【参考方案2】:您也可以尝试使用使用 html 输入元素的userInput.bat。
这会将输入分配给值 jstackId:
call userInput.bat jstackId
echo %jstackId%
这只会打印输入值,最终您可以使用FOR /F
捕获:
call userInput.bat
【讨论】:
优秀的解决方案。谢谢!【参考方案3】:set /p choice= "Please Select one of the above options :"
echo '%choice%'
=
后面的空格很重要。
【讨论】:
【参考方案4】:试试这个:
@echo off
set /p id="Enter ID: "
然后您可以使用%id%
作为另一个批处理文件(如jstack %id%
)的参数。
例如:
set /P id=Enter id:
jstack %id% > jstack.txt
【讨论】:
有没有办法将 SET 命令的输出通过管道传输到 NIL:,这样您就可以隐藏输入?就像您想做一个:set /p id=Enter ID:\r\n set /p pw=Enter Passwd:
并且不希望密码文本显示在窗口中,更不用说显示在“DosKey”命令缓冲区中?我尝试了几种不同的方法,除了编写一个小 C 程序来获取输入并将其分配给 EnvVar 之外,还没有找到一种方法,但那是作弊! :) 我希望它只适用于 Windows CMD。
@LarryF 查看***.com/questions/19950620/… 和***.com/questions/664957/…
请注意"Enter ID: "
末尾的空格。在提示和用户答案之间留出一个甜蜜的小空间。 Delete the internet?No silly
与 Delete the internet? No silly
.
不需要引号。 @Instantsoup 缺少的是 jstack %id% > jstack.txt
行中的 '%id%`
使用SETLOCAL
和ENDLOCAL
,如果您希望将变量保持在当前批次的本地。见ss64.com/nt/endlocal.html【参考方案5】:
有两种可能。
您忘记将%id%
放入jstack
调用中。
jstack %id% > jstack.txt
所以整个正确的批处理文件应该是:
@echo off
set /p id=Enter ID:
echo %id%
jstack %id% > jstack.txt
And/Or 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 文件。
【讨论】:
【参考方案6】:我在为客户端准备 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
【讨论】:
你好,这个有用的脚本在初始设置后在 Win10 电脑上使用:-)【参考方案7】:语法如下:set /p variable=[string]
查看http://commandwindows.com/batch.htm 或http://www.robvanderwoude.com/userinput.php 以更深入地了解不同版本的 Windows 操作系统批处理文件的用户输入。
设置好变量后,您可以按照以下方式使用它。
@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%
注意%VariableName%
语法
【讨论】:
请完成您的句子...您要添加另一个链接吗?此外,我在 Windows 7cmd.exe
shell 中测试了以上所有内容,并且每个 - 无一例外 - 将用户输入分配给任意命名的变量。您的回复如何修饰已经提供的内容?
当我发布我的答案时,看起来并没有真正回答原始问题。最初的问题是“你如何要求用户输入,然后转身并在另一个命令中使用它?”我相信我的回答简洁地回答了这个问题。另外,当您在 Google 中搜索“如何从批处理文件中获取用户输入”时,这个问题在结果中排名第二,因此它需要正确的答案,而我认为这个论坛的目的是。
=
后面的空格不是必须的。
我们为什么需要空间?不允许空间的cmd
到底发生了什么?
@Joey 我同意,robvanderderwoude.com page 没有空格 SET /P variable=[promptString]
【参考方案8】:
只是为了保持变量的默认值。按 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 var=<var1.txt) 2>nul
将抑制错误消息。你也可以给set var1=default
而不是从文件中获取东西
Stephan,您提案的第二部分不保留运行之间的值!?你能开发更多吗?
不,不是在两次运行之间。它只是给出一个默认值。 (没有请求在问题的运行之间存储值)。【参考方案9】:
SETX 没有像 SET 那样记录在案的 /prompt 参数。
如果您需要提示一个在重启后仍能保留的环境变量,您可以使用 SETX 来存储它。
在您重新启动命令提示符之前,SETX 创建的变量将无法使用。但是,您可以巧妙地对已设置的变量进行设置,即使它具有相同的名称。
这适用于我在 Windows 8.1 Pro 中:
set /p UserInfo= "What is your name? "
setx UserInfo "%UserInfo%"
(现有变量的引号是必须的。)
此过程允许您在当前会话期间使用由 SET 创建的临时变量,并允许您在重新启动计算机或重新启动 CMD 提示符时重复使用由 SETX 创建的变量。
(已编辑以正确格式化代码段落。)
【讨论】:
【参考方案10】:刚刚添加了
set /p NetworkLocation= Enter name for network?
echo %NetworkLocation% >> netlist.txt
我的 netsh 批处理作业的序列。它现在向我显示我响应的位置作为该样本的点。我不断地>>输出文件,所以我现在知道“家”、“工作”、“星巴克”等。寻找干净的空气,我可以评估最低使用频道以及周围是否有 5 个或只有所有 2.4 MHz WLAN。
【讨论】:
【参考方案11】:@echo off
:start
set /p var1="Enter first number: "
pause
【讨论】:
为什么要以:start
开头?
:start
只是一个标记...例如,他也可能使用:end
,这会导致发生变量清理或调用popd
等事情像那样。然后,您还可以选择使用IF ERRORLEVEL1 GOTO END
... 甚至GOTO ERR
,并在:err
下有类似回显的内容尝试获取文件号时发生错误。 goto:end 这可能是习惯问题...【参考方案12】:
@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
【讨论】:
【参考方案13】:我不确定所有版本的 Windows 是否都是这种情况,但是在我拥有的 XP 机器上,我需要使用以下内容:
set /p Var1="Prompt String"
如果没有引号中的提示字符串,我会根据文本得到各种结果。
【讨论】:
+1 表示“取决于文本的各种结果”:我遇到了同样的问题。现在它用文本打印引号,但没有更多奇怪的行为。 使用此语法拥有引号,但避免显示它们:set /p "var1=Prompt String"
使用引号并在末尾包含一个空格很有用,因为它可以使命令行上的提示更好。有了引号,很明显批处理文件中有一个空格。 set /p Var1="Prompt String "
然后当你运行文件并且用户输入一些东西你得到Prompt String Yes
而不是Prompt StringYes
【参考方案14】:
变量周围的美元符号在我的 Vista 机器上不起作用,但百分号可以。 另请注意,“set”行上的尾随空格将显示在提示符和用户输入之间。
【讨论】:
尾随空格? win7 x64 rus:C:\>set /p DestPath="Type path:"
,下一行是Type path:c:\dddd
$ 符号用于 bash 或 unix 变量。 %% 符号用于 windows 变量。
如果你的批处理文件中有一个SETLOCAL ENABLEDELAYEDEXPANSION
,你可以使用!EnvVariable!
在FOR循环期间将它扩展为它的值,或者其他不扩展宏直到行实际出现的东西由 Cmd 解析器处理。有关这方面的信息,请参阅 cmd /?
,以及 help setlocal
...以上是关于在 Windows cmd 中,如何提示用户输入并在另一个命令中使用结果?的主要内容,如果未能解决你的问题,请参考以下文章