在 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 sillyDelete the internet? No silly. 不需要引号。 @Instantsoup 缺少的是 jstack %id% > jstack.txt 行中的 '%id%` 使用SETLOCALENDLOCAL,如果您希望将变量保持在当前批次的本地。见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 7 cmd.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=&lt;var1.txt) 2&gt;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:\&gt;set /p DestPath="Type path:",下一行是Type path:c:\dddd $ 符号用于 bash 或 unix 变量。 %% 符号用于 windows 变量。 如果你的批处理文件中有一个SETLOCAL ENABLEDELAYEDEXPANSION,你可以使用!EnvVariable!在FOR循环期间将它扩展为它的值,或者其他不扩展宏直到行实际出现的东西由 Cmd 解析器处理。有关这方面的信息,请参阅 cmd /?,以及 help setlocal...

以上是关于在 Windows cmd 中,如何提示用户输入并在另一个命令中使用结果?的主要内容,如果未能解决你的问题,请参考以下文章

请模拟一下win10的cmd

Windows cmd - 使用oneliner与用户输入提示[npm]交互

cmd是啥

如何在CMD在开启SQL Sever服务

如何运用命令提示符登录ORACLE 的sys账户

windows的cmd命令